【发布时间】:2016-02-07 05:37:15
【问题描述】:
什么是从内存中删除字符串变量的所有痕迹的安全方法?
我已经知道SecureString 类的用法,但有时需要从外部源导入或处理数据,并且它们中的大多数都在使用字符串;这是一个例子:
Dim decrypted_data() As Byte = Decrypt(...)
Dim temp As String = System.Text.UTF8Encoding.UTF8.GetString(decrypted_data)
Dim sec As SecureString = GetSecureString(temp)
' Now I should remove temp contents from memory
或者在我的示例中更好的解决方案是直接将加密数据写入 SecureString 的想法,但我不知道这怎么可能。
【问题讨论】:
-
您要求一个“安全”的解决方案,但没有说明该解决方案必须能够抵御何种攻击。谁在攻击,他们在攻击什么,为什么粉碎内存是一种缓解措施?
-
@EricLippert 想象一下有人可以访问我的应用程序。有一些黑客工具可以在列表中显示应用程序字符串。所以我不希望在该列表中看到我的应用程序
decrypted_data。我想在将敏感信息转换为SecureString或encrypted_bytes_of_data等更安全的类型后清除所有敏感信息痕迹。 -
运行这些工具的人,他们是您的应用程序的用户吗?或者他们是一个人攻击你的应用程序的用户?如果您试图保护应用程序免受您自己的用户的攻击,那么我向您提交您的用户信任模型已损坏;用户是必须信任您的软件的人,反之亦然!你的软件是用户的仆人,而不是它的主人。如果攻击者正在攻击用户,那么我认为攻击者必须已经拥有对用户计算机的管理员访问权限,并且用户已经丢失了。
-
我注意到我在上一条评论中的分析包含一个重要的 - 故意的 - 错误。你看到了吗?假设具有管理员访问权限的攻击者是用户的自动损失,因此针对给定攻击的缓解措施是无用的,这是没有保证的。例如,管理员永远不需要用户密码的纯文本,因此明智的做法是粉碎密码,这样即使是敌对的管理员也无法轻易获得纯文本。 (恶意管理员当然可以安装一个键盘记录器,但这依赖于用户输入密码。)
-
也就是说,假设攻击者已经拥有系统的攻击仍然存在,这些通常不是需要防范的有趣攻击。最好首先集中精力防止攻击者将权限提升为管理员。
标签: c# vb.net string security memory-management