在VB.NET中保护内存(存储密钥)
我有一个处理加密数据的应用程序,我尽可能小心地使密钥不可访问,但当然应用程序需要以某种方式知道它们。在VB.NET中保护内存(存储密钥)
我已经将键值硬编码为函数返回值,所以它们不应该在内存中过长时间,但是我猜它仍然可以被读取。有没有办法让内存区域无法访问?如果这是一个众所周知的问题(我怀疑它是这样),我不是一个计算机科学家,所以很抱歉。
从反编译保护他们的是另一天的问题...
提前感谢!
要做到这一点的方法是使用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();
你可以不会对SecureString进行硬编码,而是用于字符串(如果有的话)。 DPAPI更适用于密钥(二进制数据),但仍然不能(有意义)硬编码。内存保护方案非常薄弱,安全方面。 – bartonjs
的例子编辑:添加HSM不一定是解决方案的情况下
A你提到的,反编译器可以获取你的密钥;这是你应该的原因的一部分从不有一个硬编码的解密密钥(一个硬编码的公钥加密是不太坏)。
如果我误解了这个问题,并且您的密钥没有进行硬编码,但您在不需要时隐藏了密钥,那么可以使用像ProtectedData.Protect这样的API。
但是,根据你在做什么,这可能不是正确的答案(谁是你的攻击者?你在防守什么?)。
从防御:
- 沃森转储被发送到微软包含密钥
- ProtectedData.Protect(或HSM)
- 的任意内存读取的安全漏洞在您的代码被远程攻击者利用
- Protect edData。保护(或讽刺“不写那种脆弱的”,或HSM)
- 管理员(合法或以其他方式)能够附加一个调试器和读取密钥
- 移动的关键到硬件安全模块(HSM)
- 你的过程中被调出和管理员能够从页面文件读取它
- HSM
- 的任意执行代码中的被远程攻击者
- HSM
- 您的系统休眠和休眠的有效载荷被利用的人谁偷了你的硬盘驱动器中读取的安全漏洞
- BitLocker或HSM
- 过程碰撞du MP这仍然是在硬盘上,驱动被盗
- 的BitLocker或HSM
- 整个计算机被物理被盗
- BitLocker的(但不一定是HSM,因为这将有也被偷了)。
你会注意到的东西,你可以用实际的内存保护抵御列表很小。更好的做法是让它无法读取密钥,将其移至HSM。 Windows CNG支持通过HSM进行对称加密,.NET 4.6.2(当前处于预览状态)支持在the AesCng(string, CngProvider) constructor中使用此行为。
“永远不要有一个硬编码的解密密钥”后来以“谁是你的攻击者”为依据。 “从不”有点苛刻,信息可能微不足道(啤酒狂欢在哪里),攻击者可能平均是好奇的青少年。反汇编文件并不是微不足道的,她是一名专业的安全人员。在某些情况下,即使不可能直接进行加密和解密,只能使用设备密码和根设备进行活动调试。最后,没有任何方案是100%安全的。 – zaph
至于HSM,这是一个很好的解决方案,但有一些注意事项:一个人必须有权访问服务器才能安装一个,典型的HSM起价大概在10K美元左右,一般情况下,密钥在使用时仍然在RAM中。 – zaph
@zaph真的,“从来没有”可能不适用,但有一个问题,“如果你不在乎有人打破这个关键,为什么它被加密?”。至于HSM,关键在于必须确定适当的威胁模型,并且HSM解决了许多(但不是全部)威胁(并不总是最简单/最便宜的)。但是一个适当的HSM可以进行片上加密/解密,所以密钥不应该放在主计算机的RAM中(这就是为什么它是有效的)。 – bartonjs
嘿队友,欢迎来到堆栈溢出,这里是一个线程,我发现你可能会觉得有用,http://stackoverflow.com/questions/23513831/hash-with-md5-in-vb-net – Werdna