如何将用户输入的密码存储在内存中,并在不再需要密码后将其安全擦除?
详细说明一下,目前我们有以下代码:
username = raw_input('User name: ')
password = getpass.getpass()
mail = imaplib.IMAP4(MAIL_HOST)
mail.login(username, password)
在调用login
方法之后,我们需要做些什么来用乱码填充包含密码的内存区域,以便有人无法通过执行核心转储来恢复密码?
有一个类似的问题,但它是在Java中,解决方案使用字符数组: How does one store password hashes securely in memory, when creating accounts?
这可以用Python完成吗?
实际上,有一种方法可以安全地删除Python中的字符串;按照Mark data as sensitive in python使用memset C函数
在文章发表后很长一段时间,编辑为添加:here's a deeper dive into string interning。在某些情况下(主要是涉及非常量字符串),不会发生内部连接,这使得基于CPython引用计数GC的字符串值清理稍微更加明确。(尽管仍然不是“擦洗/消毒”清理。)
如果完成后不需要邮件对象持久化,我认为最好的方法是在子流程中执行邮件工作(请参阅subprocess模块)。这样,当子流程死亡时,密码也会随之消失。
Python对内存的控制能力没有那么低。接受它,继续前进。最好的方法是在调用
mail.login
之后del password
,这样就不会保留对密码字符串对象的引用。任何声称能做更多事情的解决方案只会给你一种虚假的安全感。Python字符串对象是不可变的;在创建字符串之后,无法直接更改其内容。即使您能够以某种方式覆盖由
password
引用的字符串的内容(这在技术上是通过愚蠢的ctypes技巧实现的),仍然会有在各种字符串操作中创建的密码的其他副本:无论如何,您必须获得对所有这些字符串的引用,并覆盖它们的内存。
相关问题 更多 >
编程相关推荐