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

时间:2009-06-11 18:05:48

标签: python security passwords coredump

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

5 个答案:

答案 0 :(得分: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)

我不保证此代码的安全性。它经过测试可用于x86和CPython 2.6.2。较长的写入是here

在Python中解密和加密将无法正常工作。字符串和整数是实体和持久的,这意味着你将在整个地方留下一堆密码信息。

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

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

但如果你的记忆不断受到损害,我会重新考虑你的安全设置。

答案 1 :(得分: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

来源: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 ++代码中查找安全漏洞。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

  • 单独存储的XOR
  • 始终存储salted哈希而不是密码本身

或者,如果您对转储非常偏执,请在其他地方存储唯一的随机密钥,例如:我是一个不同的线程,在注册表中,在您的服务器上等。

答案 4 :(得分:0)

基于culix的回答:以下内容适用于Linux 64位体系结构。
在基于Debian的系统上进行了测试。

import sys 
import ctypes

def nuke(var_to_nuke):
    strlen = len(var_to_nuke)
    offset = sys.getsizeof(var_to_nuke) - strlen - 1
    ctypes.memset(id(var_to_nuke) + offset, 0, strlen)
    del var_to_nuke               # derefrencing the pointer.