在学习 Java 时,我了解到字符串对于存储密码并不安全,因为您无法手动清除与它们关联的内存(您不能确定它们最终会被 gc'ed,interned 字符串可能永远不会,甚至在gc 你不能确定物理内存内容是否真的被擦除了)。相反,我将使用 char 数组,因此我可以在使用后将它们归零。我试图在其他语言和平台上搜索类似的做法,但到目前为止我找不到相关信息(通常我看到的只是存储在字符串中的密码示例,没有提及任何安全问题)。
我对浏览器的情况特别感兴趣。我经常使用 jQuery,我通常的方法是将密码字段的值设置为空字符串,然后忘记它:
$(myPasswordField).val("");
但我不是 100% 相信这就足够了。我也不知道用于中间访问的字符串是否安全(例如,当我$.ajax
用来将密码发送到服务器时)。至于其他语言,通常我看不到这个问题(我特别感兴趣的另一种语言是 Python)。
我知道尝试建立列表的问题是有争议的,但由于这涉及一个在很大程度上被忽视的常见安全问题,恕我直言,这是值得的。如果我弄错了,我很乐意从 JavaScript(在浏览器中)和 Python 中知道。我也不确定是在security.SE还是在programmers.SE问这里,但由于它涉及安全执行任务的实际代码(不是概念性问题),我相信这个站点是最好的选择。
注意:在低级语言或明确支持字符作为原始类型的语言中,答案应该很明显(编辑:不是很明显,正如@Gabe 在下面的答案中所示)。我要求那些“一切都是对象”或类似的高级语言,以及那些在幕后执行自动字符串实习的语言(所以你可能会在没有意识到的情况下创建一个安全漏洞,即使你'相当小心)。
更新:根据相关问题的答案char[]
,即使在 Java 中使用也不能保证是防弹的(或 .NET SecureString,就此而言),因为 gc 可能会移动数组,因此即使在之后它的内容也可能会留在内存中清除(SecureString 至少坚持相同的 RAM 地址,保证清除,但它的消费者/生产者可能仍会留下痕迹)。
我猜@NiklasB。是的,虽然漏洞存在,但被利用的可能性很低,而防范的难度很高,这可能是这个问题大多被忽略的原因。我希望我能找到至少一些关于浏览器的这个问题的参考,但是到目前为止,谷歌搜索一直没有结果(这个场景至少有一个名字吗?)。