[英]Protect memory (storing keys) in VB.NET
我有一个处理加密数据的应用程序,并且我尝试过尽可能小心以使密钥不可访问,但是当然,该应用程序需要以某种方式知道它们。
我已经将这些键硬编码为函数返回值,因此它们不应在内存中停留太久,但是我猜仍然可以读取它们。 有没有办法使内存区域不可访问? 我不是计算机科学家,所以如果这是一个众所周知的问题,我深表歉意(我怀疑是这样)。
保护他们免受反编译器困扰是另一天的问题。
提前致谢!
做到这一点的方法是使用SecureString
。 与普通字符串相比,使用它有点尴尬,但这是您在此情况下确实需要的东西。
这是它的文档: https : //msdn.microsoft.com/zh-cn/library/system.security.securestring(v=vs.110).aspx
以及与此有关的更多信息: SecureString在C#应用程序中是否可行?
这是将其设置为使用“字符串值”的示例
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();
编辑:添加了HSM不一定是解决方案的情况
如您所述,反编译器可以帮助您解决问题。 这是您永远不要对解密密钥进行硬编码的部分原因(要加密的硬编码公共密钥不太坏)。
如果我误解了这个问题,并且您的密钥不是硬编码的,但是您试图在不需要密钥时将其隐藏,那么诸如ProtectedData.Protect之类的API可能就是您想要的。
但是,根据您在做什么,这可能不是正确的答案(您的攻击者是谁?您在防御什么?)。
捍卫:
您会注意到,实际上可以通过内存保护来防御的事物列表很小。 更好的办法是将其移至HSM,以使任何人都无法读取密钥。 Windows CNG通过HSM支持对称加密,.NET 4.6.2(当前处于预览状态)支持通过AesCng(string,CngProvider)构造函数利用此行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.