我一直在寻找一种方法来存储给定的AES密钥,以便它不能被检索,但它仍然可以用于加密和解密(使用C#)。我认为非对称密钥存储的等价物可以找到here,但我正在寻找可用于对称加密的东西。它是否以托管形式存在(pre。net 4)?如何使用.Net(C#)在Windows中安全地存储AES密钥?
回答
根据你所反对的人,你可以使用ProtectedData
class。
我们可能必须走这条路,但我的理解是,如果我们使用ProtectedData存储我们的密钥,那么我们可以稍后再取回它。我们不想让它恢复原状,只能使用它。 – Nogwater 2010-09-29 21:35:56
您只能以相同的用户身份登录后才能重新登录。 – SLaks 2010-09-29 21:59:05
是的,我认为这可能对我们有用。这并不是很理想,因为我们将软件安装在一组机器上,这意味着我们需要存储的AES密钥的加密块在每台机器上会有所不同。现在我们倾向于这样:http://www.codestrider.com/BlogRead.aspx?b=d147ff4f-65e0-47f5-a39b-40ae07a42005使用公钥/私钥加密和Window的证书存储来保护真正的关键。 – Nogwater 2010-09-29 22:11:51
@SLaks是正确的,如果它在你的记忆中它可以被访问。你可以让它变得更加困难,但总有可能。
这就是为什么那些严肃卸载密码的人。
一个选项是smart card。这使您可以将数据移动到卡上并返回结果,但不允许访问密钥材料。它不在您的PC内存空间中,因此无法泄漏。
罗斯安德森有一篇很好的论文,Programming Satan's Computer关于这种事情。摘要:
问题是存在一个敌意的对手, 谁可以随意改变信息。实际上,我们的 任务是编写一个计算机,该计算机给出的答案是 ,它们在最不方便的时刻可能会出现错误和恶意 错误。
即使你不关心物理内存,只是硬盘和源,你仍然需要警惕虚拟内存。如果您不小心(或使用精心编写的服务),您可以在交换文件中获得纯文本密钥。这是另一个讨论这个问题的链接。不是你想这样做,但它使问题变得明显:Encrypting Virtual Memory。我相信有系统调用为此目的将内存标记为不可擦除,但我找不到链接。
即使对于非对称数据,如果密钥存储在计算机中并稍后使用,则在使用之前将其检索并解密。在这一点上,一个熟练的黑客可以检索它(通过捕获计算机内存并研究它)。这不是微不足道的,但仍然有可能。
通常为了解决您的问题提供了USB cryptotokens和cryptocards。这些硬件设备有自己的存储器用于存储对称密钥和非对称密钥,并且它们具有使用该密钥执行加密操作的处理器。密钥永远不会离开设备,并且实际上不可能从设备中强制提取它(存在一些硬件攻击,例如使用显微镜扫描内存,但它们比计算机上的软件攻击更复杂)。
因此,如果您的密钥真的很有价值,请使用USB cryptotoken。该设备的价格非常适中 - 每个单元大约70美元至100美元,并且有几家供应商提供这种设备。
Windows DPAPI(Win32 documentation)及其.NET包装器(ProtectedData Class)不存储任何数据。相反,Windows DPAPI会返回一个加密密码值,您可以将其存储在任何地方,包括多台服务器上。
在我的工作地点,我们使用DPAPI为AES密钥生成密码,然后我们将其存储在注册表中。
Windows DPAPI的唯一目的是对数据进行加密,以便只有给定的用户帐户或机器才能解密它,而无需存储密码。
.NET ProtectedData类自2.0以来一直在.NET Framework中。
我会坚持与第三方产品的Windows DPAPI,因为它成熟,稳定,免费,易于使用,并在.NET中完全支持。
只是为了确定我的理解......要在多台机器上使用ProtectedData,需要在这两台机器上都有一个共享用户帐户,这需要由域控制器提供,对吗? – Nogwater 2010-10-04 15:32:25
您可以使用DPAPI在两台独立的计算机上独立加密密钥,如果需要,可以在两个不同的用户帐户下运行,只需要两个密码值不可互换即可。必须在进行加密的相同帐户(或使用基于机器的DPAPI的机器)下解密。如果你想拥有一个可以在多台机器上解密的密码,那么是的,我会说你需要一个共享帐户和一个域控制器。 – saille 2010-10-04 20:24:04
感谢您的澄清。 – Nogwater 2010-10-04 22:02:48
- 1. 如何在C++中安全地存储AES加密密钥?
- 2. 安全存储AES密钥
- 3. 如何安全地在.Net中存储加密密钥?
- 4. 如何在iPhone上安全地存储AES密钥
- 5. 安全地在Android设备中存储AES密钥
- 6. 如何安全地存储密钥?
- 7. 如何在Silverlight 4中安全地存储密钥或私钥?
- 8. 如何在android中安全地存储加密密钥?
- 9. 如何在java中安全地存储加密密钥?
- 10. 存储AES密钥
- 11. 何处存储AES密钥?
- 12. PHP中的AES-256和安全存储密钥?
- 13. 在WinRT/Windows Store应用程序中安全地存储加密密钥
- 14. 如何在使用AES的安卓系统中安全地存储加密密码并在以后解密?
- 15. 如何解密本地存储的密钥尽可能安全
- 16. 如何安全地存储应用程序ID /密钥?
- 17. API密钥可以安全地存储在Windows应用商店应用中吗?
- 18. 在Rails 3应用程序中安全地存储API密钥
- 19. 沿着加密的AES密钥存储密码哈希的安全隐患
- 20. 如何存储加密密钥.NET
- 21. AES加密和密钥存储?
- 22. 密钥容器,足够安全地存储私钥?
- 23. 在iPad/iPhone上的用户会话期间安全地存储安全密钥?
- 24. 如何在.NET中安全地使用二进制文件分发密钥?
- 25. 安全的地方存储API秘密密钥
- 26. 在PHP中使用AES加密时,应该在哪里存储密码密钥?
- 27. Android的安全存储密钥
- 28. 如何安全地将用户密码存储在Cloudant DB中?
- 29. 如何在AES数据库中存储AES加密密码
- 30. 如何在Android中安全地存储EC私钥?
如果您可以使用它进行加密,您可以检索它。 – SLaks 2010-09-29 21:32:53
@ SLaks:除非操作系统是在做什么加密,并将密钥存储在某个“安全”的地方。比如说,“保护存储”服务可能会这样做。 – cHao 2010-09-29 21:37:24
@cHow。这就是我的想法。微软提供了这种类型的功能与证书(他们可以存储和使用您的私钥安全),但可能不是我所期待的。 – Nogwater 2010-09-29 22:00:19