在VB.NET中保护内存(存储密钥)

时间:2016-07-26 06:46:16

标签: .net vb.net string security encryption

我有一个处理加密数据的应用程序,我试图尽可能小心地使密钥无法访问,但当然应用程序需要以某种方式了解它们。

我已经将键硬编码为函数返回值,因此它们永远不会在内存中停留太久,但我想它们仍然可以被读取。有没有办法让记忆区域无法访问?如果这是一个众所周知的问题(我怀疑它是),我不是计算机科学家,所以道歉。

将它们从反编译器中保护是另一天的问题......

提前致谢!

2 个答案:

答案 0 :(得分:1)

执行此操作的方法是使用SecureString。使用它比使用普通字符串更尴尬,但这是您在这种情况下所需要的。

以下是文档:https://msdn.microsoft.com/en-us/library/system.security.securestring(v=vs.110).aspx

以及有关它的更多信息:Is SecureString ever practical in a C# application?

以下是将此设置为使用“字符串值”

的示例
        var s = new System.Security.SecureString();           
        s.AppendChar('s');
        s.AppendChar('e');
        s.AppendChar('c');
        s.AppendChar('r');
        s.AppendChar('e');
        s.AppendChar('t');
        s.AppendChar('s');
        s.AppendChar('q');
        s.AppendChar('u');
        s.AppendChar('i');
        s.AppendChar('r');
        s.AppendChar('r');
        s.AppendChar('e');
        s.AppendChar('l');
        s.MakeReadOnly();

答案 1 :(得分:1)

编辑:添加了HSM不一定是解决方案的案例

如你所说,反编译器可以获取你的钥匙;这部分原因是你应该从不对解密密钥进行硬编码(加密的硬编码公钥不太糟糕)。

如果我误解了这个问题并且您的密钥没有硬编码,但是您在不需要密钥时尝试隐藏密钥,则可能会找到ProtectedData.Protect之类的API。

但是根据你正在做的事情,这可能不是正确的答案(谁是你的攻击者?你在捍卫什么?)。

捍卫:

  • 发送给包含密钥的Microsoft的Watson转储
    • ProtectedData.Protect(或HSM)
  • 远程攻击者利用您的代码中的任意内存读取安全漏洞
    • ProtectedData.Protect(或讽刺“不写那种漏洞”或HSM)
  • 管理员(合法或其他)能够附加调试器并读取密钥
    • 将密钥移至硬件安全模块(HSM)
  • 您的流程被分页,管理员可以从页面文件中读取它
    • HSM
  • 远程攻击者利用您的代码中的任意执行安全漏洞
    • HSM
  • 您的系统正在休眠,并且窃取硬盘驱动器的人正在读取休眠负载
    • BitLocker或HSM
  • 仍在硬盘驱动器上并且驱动器被盗的进程崩溃转储
    • BitLocker或HSM
  • 整个计算机都被盗了
    • BitLocker(但不一定是HSM,因为它也会被盗)。

您会注意到,您可以通过内存保护实际防范的内容很少。更好的是通过将其移动到HSM,使任何东西都无法读取密钥。 Windows CNG通过HSM支持对称加密,.NET 4.6.2(当前处于预览状态)支持将此行为与the AesCng(string, CngProvider) constructor一起使用。