安全擦除内存中的密码(Python)

2024-05-15 10:15:39 发布

您现在位置:Python中文网/ 问答频道 /正文

如何将用户输入的密码存储在内存中,并在不再需要密码后将其安全擦除?

详细说明一下,目前我们有以下代码:

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完成吗?


Tags: 内存代码用户name密码inputrawusername
3条回答

实际上,有一种方法可以安全地删除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技巧实现的),仍然会有在各种字符串操作中创建的密码的其他副本:

  • 当getpass模块从输入的密码中去掉尾随的换行符时
  • 由imaplib模块引用密码,然后在将其传递到套接字之前创建完整的IMAP命令

无论如何,您必须获得对所有这些字符串的引用,并覆盖它们的内存。

相关问题 更多 >