【发布时间】:2021-06-03 00:15:06
【问题描述】:
用例是在c#的内存编程中保护字符串。 Microsoft 本身不鼓励使用 SecureString (https://docs.microsoft.com/en-us/dotnet/api/system.security.securestring?view=netframework-4.7.2) 类。
我想知道它是否可以有效替代:
- 将字符串转换成字节数组并立即将字符串设置为null(并最终调用垃圾收集器),
- 使用 ProtectedMemory 类加密字节数组。
有什么建议吗?
【问题讨论】:
-
为什么?您要解决的实际问题是什么?你想保护什么?如果有人在您的服务器上具有调试权限,能够进行内存转储并检查内存内容,那么您已经迷路了。 Microsoft 建议不要使用 SecureString 的原因是 all 解决方案会将字符串作为明文在内存中保留一段时间,无论多小。即使你加密了字符串,它也必须以明文开始,然后才能被加密
-
@PanagiotisKanavos “即使你加密了字符串,它也必须以明文开头,然后才能加密” - 这是不正确的。
SecureString.Append意味着您可以从用户输入(例如,每次按键)构造一个安全字符串,而无需存储明文。 -
@Dai 并且用户输入是明文。一次输入一个按键甚至不会完整的键盘记录器。 SecureString 在有限的范围内提供有限的保护。这并不是为了保护输入过程。 使用该字符串也需要提取内容
-
@PanagiotisKanavos 信用卡号在加密之前是明文的原因是用户以明文形式输入。我们希望确保尽快将其从内存中删除。如果论点是我们永远不应该打扰:那很好。但是 Windows 在给你一个 4KB 页面之前仍然是零内存(所以你看不到之前页面上的内容),它仍然有
SecureZeroMemory。 -
@IanBoyd 的论点是 .NET 团队说 SecureString 不安全并且提供非常有限的安全性,同时给人一种安全的假象。原始信用卡文本将在内存中,直到它被 GC'd。一旦你使用了 Windows API,或者任何不理解 SecureString 的东西,你就会得到这个字符串。
标签: c# encryption securestring