gpt4 book ai didi

string - 以不同语言清除内存以确保安全

转载 作者:行者123 更新时间:2023-12-02 10:49:32 26 4
gpt4 key购买 nike

在学习Java时我了解到字符串是not safe for storing passwords ,因为您无法手动清除与它们关联的内存(您无法确定它们最终会被 gc'ed,interned 字符串可能永远不会被 gc'ed,即使在 gc 之后,您也不能确定物理内存内容是否真的被 gc'ed)擦掉了)。相反,我使用 char 数组,这样我就可以在使用后将它们清零。我尝试在其他语言和平台上搜索类似的做法,但到​​目前为止我找不到相关信息(通常我看到的只是存储在字符串中的密码的代码示例,没有提及任何安全问题)。

我对浏览器的情况特别感兴趣。我经常使用 jQuery,我通常的方法是将密码字段的值设置为空字符串,然后忘记它:

$(myPasswordField).val("");

但我并不 100% 相信这就足够了。我也不知道用于中间访问的字符串是否安全(例如,当我使用 $.ajax 将密码发送到服务器时)。至于其他语言,通常我看不到提及这个问题(我特别感兴趣的另一种语言是Python)。

我知道尝试建立列表的问题是 controversial ,但由于这涉及一个在很大程度上被忽视的常见安全问题,恕我直言,这是值得的。如果我弄错了,我很乐意仅从 JavaScript(在浏览器中)和 Python 中知道。我也不确定是否要在这里问,在security.SE或在 programmers.SE ,但由于它涉及安全执行任务的实际代码(不是概念问题),我相信这个网站是最好的选择。

注意:在低级语言或明确支持字符作为原始类型的语言中, 答案应该是显而易见的 (编辑:并不是很明显,正如 @Gabe 在下面的回答中所示)。我要求使用那些“一切都是对象”或类似的高级语言,以及那些在幕后执行自动字符串实习的语言(因此您可能会在没有意识到的情况下创建一个安全漏洞,即使您'相当小心)。

更新:根据an answer在一个相关的问题中,即使在Java中使用 char[] 也不能保证是防弹的(或 .NET SecureString ,就此而言),因为 gc 可能会移动数组,因此它的内容可能会即使在清除后仍保留在内存中(SecureString 至少保留在相同的 RAM 地址中,保证清除,但其消费者/生产者仍可能留下痕迹)。

我猜@NiklasB。是的,即使漏洞存在,但被利用的可能性很低,而且防范难度很高,这可能是这个问题大多被忽视的原因。我希望我至少能找到一些有关浏览器问题的引用资料,但到目前为止,谷歌搜索还没有结果(这个场景至少有一个名称吗?)。

最佳答案

.NET 的解决方案是 SecureString .

A SecureString object is similar to a String object in that it has a text value. However, the value of a SecureString object is automatically encrypted, can be modified until your application marks it as read-only, and can be deleted from computer memory by either your application or the .NET Framework garbage collector.

请注意,即使对于像 C 这样的低级语言,答案也不像看起来那么明显。现代编译器可以确定您正在写入字符串(将其清零),但从不读取您读出的值,而只是优化清零。为了防止优化失去安全性,Windows提供了SecureZeroMemory .

关于string - 以不同语言清除内存以确保安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10166986/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com