代码之家  ›  专栏  ›  技术社区  ›  lfaraone

在python中将数据标记为敏感

  •  20
  • lfaraone  · 技术社区  · 15 年前

    我需要在内存中短时间存储用户密码。我如何才能做到这一点,却没有在coredumps或tracebacks中意外地公开这些信息?有没有一种方法可以将值标记为“敏感”,这样调试器就不会将其保存到任何地方?

    4 回复  |  直到 6 年前
        1
  •  32
  •   culix    11 年前

    编辑

    我提出了一个使用ctypes(反过来使用c)将内存归零的解决方案。

    import sys
    import ctypes
    
    def zerome(string):
        location = id(string) + 20
        size     = sys.getsizeof(string) - 20
    
        memset =  ctypes.cdll.msvcrt.memset
        # For Linux, use the following. Change the 6 to whatever it is on your computer.
        # memset =  ctypes.CDLL("libc.so.6").memset
    
        print "Clearing 0x%08x size %i bytes" % (location, size)
    
        memset(location, 0, size)
    

    我不能保证这一准则的安全。它在x86和CPython 2.6.2上进行了测试。更长的写操作是 here .

    在python中解密和加密将不起作用。字符串和整数被截留和持久化,这意味着你会在各处留下一堆密码信息。

    哈希是标准答案,当然明文最终需要在某个地方处理。

    正确的解决方案是作为C模块执行敏感过程。

    但是如果你的记忆经常被破坏,我会重新考虑你的安全设置。

        2
  •  5
  •   Alvarolm    12 年前

    唯一的解决方案是使用可变的数据结构。 那 是的,您只能使用允许您动态 更换元件。例如,在Python中,可以使用列表来存储 字符数组。然而, 每次添加或删除元素时 从列表中,语言可能会将整个列表复制到背后 , 取决于实现细节。为了安全,如果必须的话 动态调整数据结构的大小, 你应该创建一个新的,复制 数据,然后重写旧数据 . 例如:

    def paranoid_add_character_to_list(ch, l):
      """Copy l, adding a new character, ch.  Erase l.  Return the result."""
      new_list = []
      for i in range(len(l)):
        new_list.append(0)
      new_list.append(ch)
      for i in range(len(l)):
        new_list[i] = l[i]
        l[i] = 0
      return new_list
    

    来源: http://www.ibm.com/developerworks/library/s-data.html

    • 作者:John Viega(viega@list.org)是Building Secure的合著者 软件(Addison Wesley,2001)和Java企业架构 (O'Reilly and Associates,2001年)。约翰写了50多篇 主要在软件安全领域的技术出版物。 他还写了mailman,GNU邮件列表管理器和ITS4,一个工具 用于查找C和C++代码中的安全漏洞。
        3
  •  2
  •   Alex Martelli    15 年前

    没有办法“标记为敏感”,但是您可以在需要使用数据时对内存中的数据进行加密并再次解密——这不是一个完美的解决方案,而是我能想到的最好的解决方案。

        4
  •  2
  •   ilya n.    15 年前
    • 带有单独存储的一次性PAD的XOR
    • 总是存储盐散列而不是密码本身

    或者,如果您对转储非常偏执,可以将唯一的随机键存储在其他地方,例如,在注册表、服务器等中的其他线程中。