我需要在内存中短时间存储用户密码.我怎么能这样做却没有在coredumps或追溯中意外披露这些信息?有没有办法将值标记为"敏感",因此它不会被调试器保存在任何地方?
我遇到了与bytesPython3.2 相关的内存管理问题.在某些情况下,ob_sval缓冲区似乎包含我无法解释的内存.
对于特定的安全应用程序,我需要能够确保内存"归零"并在不再使用后尽快返回给操作系统.由于重新编译Python实际上不是一个选项,我正在编写一个可以与LD_PRELOAD一起使用的模块:
PyObject_Malloc用PyMem_Malloc,PyObject_Realloc用PyMem_Realloc,并PyObject_Free用PyMem_Free(例如:你会得到什么,如果你没有编译WITH_PYMALLOC).我不在乎记忆是否合并,但这似乎是最简单的方法.malloc,realloc以及free跟踪请求的内存量以及发布时的memset所有内容0.粗略地看一下,这种方法似乎很有效:
>>> from ctypes import string_at
>>> from sys import getsizeof
>>> from binascii import hexlify
>>> a = b"Hello, World!"; addr = id(a); size = getsizeof(a)
>>> print(string_at(addr, size))
b'\x01\x00\x00\x00\xd4j\xb2x\r\x00\x00\x00<J\xf6\x0eHello, World!\x00'
>>> del a
>>> print(string_at(addr, size))
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00'
Run Code Online (Sandbox Code Playgroud)
最后的错误\x13是奇怪的,但不是来自我的原始值,所以起初我认为它没关系.我很快找到了不太好的例子:
>>> a = …Run Code Online (Sandbox Code Playgroud) 我们的基于Web的应用程序使用帐户创建期间指定的密码将用户帐户绑定到用户.对于Java,在将哈希值保存在数据库中之前,如何安全地处理密码.
更具体地说,如何确保持有密码的字符串在足够短的时间间隔内被垃圾收集?
在学习Java时,我了解到Strings 对于存储密码是不安全的,因为你无法手动清除与它们相关的内存(你不能确定它们最终会被gc'ed,内部字符串可能永远不会,甚至之后gc你不能确定物理内存内容真的被擦除了).相反,我使用char数组,所以我可以在使用后将它们清零.我试图在其他语言和平台上搜索类似的做法,但到目前为止我找不到相关的信息(通常我看到的是密码存储在字符串中的代码示例,没有提到任何安全问题).
我对浏览器的情况特别感兴趣.我经常使用jQuery,而我通常的做法就是将密码字段的值设置为空字符串而忘记它:
$(myPasswordField).val("");
Run Code Online (Sandbox Code Playgroud)
但我并不是100%确信它已经足够了.我也不知道用于中间访问的字符串是否安全(例如,当我$.ajax用来将密码发送到服务器时).至于其他语言,通常我没有提到这个问题(我特别感兴趣的另一种语言是Python).
我知道试图建立列表的问题是有争议的,但由于这涉及一个很大程度上被忽视的共同安全问题,恕我直言,这是值得的.如果我弄错了,我会很高兴知道从JavaScript(在浏览器中)和Python.我也不确定是在这里,在security.SE还是在程序员.SE,但由于它涉及安全执行任务的实际代码(不是概念性问题),我相信这个网站是最好的选择.
注意:在低级语言或明确支持字符作为原始类型的语言中,答案应该是显而易见的(编辑:不是很明显,正如@Gabe在下面的答案中所示).我要求那些"一切都是对象"或类似的高级语言,以及那些在幕后执行自动字符串实习的人(所以你可能会创建一个安全漏洞而不会意识到它,即使你'合理谨慎).
更新:根据相关问题的答案,即使char[]在Java中使用也不能保证是防弹的(或者就此而言是.NET SecureString),因为gc可能会移动数组,因此其内容可能会粘在内存中,即使在清除(SecureString至少保留在相同的RAM地址中,保证清除,但其消费者/生产者可能仍然留下痕迹).
我猜@NiklasB.是正确的,即使漏洞存在,漏洞利用的可能性很低,防止漏洞的难度很高,这可能是这个问题大多被忽视的原因.我希望我至少可以找到关于浏览器这个问题的一些参考,但谷歌搜索到目前为止一直没有结果(这个场景至少有一个名字吗?).
我正在用Python创建一个涉及散列密码的程序.假设我使用它来获取密码:
import getpass
password = getpass.getpass("Password: ")
Run Code Online (Sandbox Code Playgroud)
然后散列它,有没有办法从RAM中安全地删除所有未散列密码的痕迹?
假设我将密码以纯文本形式存储在一个名为passWd字符串的变量中.一旦我丢弃它,python如何释放这个变量(例如,用del passWd或passWd= 'new random data')?
字符串是否存储为字节数组意味着它可以在它最初存在的内存中被覆盖,或者它是一个无法修改的内存区域中的固定集合,并且在为新值指定新内存区域时是创建并旧区域被删除但不被null覆盖?
我在质疑Python如何实现内存区域的安全性,并希望了解更多信息,主要是因为我很好奇:)
从我到目前为止收集到的,使用del(或__del__)导致解释器不会自动释放该变量的内存区域,这可能会导致问题,而且我也不确定del在删除值时是如此频繁.但这只是我收集的内容,而不是黑色或白色的东西:)
我要问的主要原因是,我打算编写一个获取字符串的移交应用程序,执行一些I/O,将其传递给另一个子系统(例如,用于覆盆子pi的bootloader)并且接口是用Python(在某些人的耳朵里听起来多么奇怪......)并且我并不担心数据在I/O计算期间受到损害,但是在两个子系统切换之间可能会发生内存转储.或者,如果系统被冻结(比如说是一个hiberation)说系统启动后20分钟,我尽可能快地删除了变量,但不管怎么说,尽管我做了一个del passWd:) 它仍然在内存中
(Ps.我曾经问过超级用户,他们在这里提到我,我很抱歉语法很差!)
我有一个小的python程序,将由一小群人(<15人)在本地使用.但是为了问责制,我希望在程序开始时使用简单的用户名+密码检查(不需要对于你的信息,我只是一个初学者,这是我第一次尝试它.当我搜索时,我发现python有passlib加密.但即使看了之后,我仍然不确定如何实现我的加密.所以,我想知道一些事情.
我很抱歉这些愚蠢的问题.但如果你能回答我的问题,我将不胜感激.