我有一个处理加密数据的应用程序,我试图尽可能小心地使密钥无法访问,但当然应用程序需要以某种方式了解它们。
我已经将键硬编码为函数返回值,因此它们永远不会在内存中停留太久,但我想它们仍然可以被读取。有没有办法让记忆区域无法访问?如果这是一个众所周知的问题(我怀疑它是),我不是计算机科学家,所以道歉。
将它们从反编译器中保护是另一天的问题......
提前致谢!
答案 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。
但是根据你正在做的事情,这可能不是正确的答案(谁是你的攻击者?你在捍卫什么?)。
捍卫:
您会注意到,您可以通过内存保护实际防范的内容很少。更好的是通过将其移动到HSM,使任何东西都无法读取密钥。 Windows CNG通过HSM支持对称加密,.NET 4.6.2(当前处于预览状态)支持将此行为与the AesCng(string, CngProvider) constructor一起使用。