在python中将数据标记为敏感数据

lfa*_*one 20 python security passwords coredump

我需要在内存中短时间存储用户密码.我怎么能这样做却没有在coredumps或追溯中意外披露这些信息?有没有办法将值标记为"敏感",因此它不会被调试器保存在任何地方?

Unk*_*own 33

编辑

我已经制定了一个使用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)
Run Code Online (Sandbox Code Playgroud)

我不保证此代码的安全性.它经过测试可用于x86和CPython 2.6.2.这里有更长的写作.

在Python中解密和加密是行不通的.字符串和整数是间接和持久的,这意味着你将在整个地方留下一堆密码信息.

散列是标准答案,当然明文最终需要在某处进行处理.

正确的解决方案是将敏感过程作为C模块.

但是,如果你的记忆不断被破坏,我会重新考虑你的安全设置.

  • 这是正确的.如果您/曾经/将密码读入Python对象,则可能会被转储破坏.即使使用C也不完美(你仍然可以冻结程序并使用内核级调试器),但它应该足够好. (2认同)
  • 丹尼:memset很安全.您链接到的文章是关于删除memset调用的C编译器.当我们从Python中显式调用memset时,会调用它. (2认同)
  • 此解决方案在 Mac OS 10.8.5 下使 Python 2.7.2(分段错误:11)崩溃(使用 `memset=ctypes.CDLL("libc.dylib").memset`) (2认同)

Alv*_*olm 5

... 唯一的解决方案是使用可变数据结构.也就是说,您必须仅使用允许您动态替换元素的数据结构.例如,在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
Run Code Online (Sandbox Code Playgroud)

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

  • 作者:John Viega(viega@list.org)是Building Secure Software(Addison-Wesley,2001)和Java Enterprise Architecture(O'Reilly and Associates,2001)的合着者.John撰写了50多篇技术出版物,主要是在软件安全领域.他还编写了Mailman,GNU邮件列表管理器和ITS4,这是一种用于查找C和C++代码中的安全漏洞的工具.