当前位置: 首页 > 面试题库 >

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

江德润
2023-03-14
问题内容

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

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

username = raw_input('User name: ')
password = getpass.getpass()
mail = imaplib.IMAP4(MAIL_HOST)
mail.login(username, password)

调用该login方法后,我们该怎么办才能用乱码填充包含密码的内存区域,以使某人无法通过执行核心转储来恢复密码?

可以用Python完成吗?


问题答案:

Python对内存的控制没有那么低。接受它,继续前进。在 最好的 ,你可以做的是del password调用后mail.login,这样的口令字符串对象的引用依然存在。任何声称能够做得更多的解决方案,只会给您一种错误的安全感。

Python字符串对象是不可变的。创建字符串后,没有直接方法可以更改它的内容。 即使
您能够以某种方式覆盖所引用的字符串的内容(在password愚蠢的ctypes技巧上,这在技术上是可行的),仍然会有在各种字符串操作中创建的其他密码副本:

  • 由getpass模块在将结尾的换行符从输入的密码中删除时
  • 由imaplib模块引用密码时,然后创建完整的IMAP命令,然后将其传递给套接

您将不得不以某种方式获取所有这些字符串的引用,并覆盖它们的内存。



 类似资料:
  • 问题内容: 而且我需要知道它将不会被Java优化器删除。 问题答案: 字符串不能被“擦除”。它是一成不变的,缺少一些真正肮脏和危险的技巧,您无法改变。 因此,最安全的解决方案是首先不要将数据放入字符串中。请改用StringBuilder或字符数组,或使用其他不可变的表示形式。(然后在完成后清除它。) 作为记录,您可以通过几种方法来更改String的后备数组的内容。例如,您可以使用反射来获取对Str

  • 内存安全 Rust推崇安全与速度至上,它没有垃圾回收机制,却成功实现了内存安全 (memory safety)。 所有权 在Rust中,所有权 (ownership) 系统是零成本抽象 (zero-cost abstraction) 的一个主要例子。 对所有权的分析是在编译阶段就完成的,并不带来任何运行时成本 (run-time cost)。 默认情况下,Rust是在栈 (stack) 上分配内存

  • 在一个应用程序中,我使用Android密钥库。我已经为整个密钥库和每个密码条目设置了密码。因为这些密码是字符串,所以它们存储在代码的字符串成员中。 显然,如果我想发布应用程序,这是不安全的,因为潜在的攻击者可以反编译apk并获取密码,因为它是硬编码在应用程序中的。 我的问题是: 在上面的场景中:攻击者是否能够读取我的密钥库文件,或者(在无根手机上)该文件是否只能由我的应用程序访问,因此仅密码是不够

  • 问题内容: 我在工作场所使用Git,并且公司政策不允许我以不安全的方式存储密码。有没有比将密码存储到Git服务器更好的选择了? PS无法使用密钥验证,因为我们的服务器不允许使用密钥验证。 问题答案: 不是很安全;如文档中所说: 使用此帮助程序会将密码未加密地存储在磁盘上,仅受文件系统权限保护 〜/ .git-credentials文件将设置其文件系统权限,以防止系统上的其他用户读取它,但不会被加密

  • 默认情况下,Swift 会阻止你代码中发生的不安全行为。比如说,Swift 会保证在使用前就初始化,内存在变量释放后这块内存就不能再访问了,以及数组会检查越界错误。 Swift 还通过要求标记内存位置来确保代码对内存有独占访问权,以确保了同一内存多访问时不会冲突。由于 Swift 自动管理内存,大部份情况下你根本不需要考虑访问内存的事情。总之,了解一下什么情况下会潜在导致冲突是一件很重要的事情,这

  • 我对源代码中的密码有一个问题。例如,如果你想连接到FTP服务器,你必须在源代码中以纯文本形式写入密码。这安全吗?或者可以反编译JAR文件或Android APK文件,以获取纯文本格式的数据吗?有没有安全的方法来存储数据?