2010-09-29 57 views
9

我一直在寻找一种方法来存储给定的AES密钥,以便它不能被检索,但它仍然可以用于加密和解密(使用C#)。我认为非对称密钥存储的等价物可以找到here,但我正在寻找可用于对称加密的东西。它是否以托管形式存在(pre。net 4)?如何使用.Net(C#)在Windows中安全地存储AES密钥?

+0

如果您可以使用它进行加密,您可以检索它。 – SLaks 2010-09-29 21:32:53

+1

@ SLaks:除非操作系统是在做什么加密,并将密钥存储在某个“安全”的地方。比如说,“保护存储”服务可能会这样做。 – cHao 2010-09-29 21:37:24

+0

@cHow。这就是我的想法。微软提供了这种类型的功能与证书(他们可以存储和使用您的私钥安全),但可能不是我所期待的。 – Nogwater 2010-09-29 22:00:19

回答

2

根据你所反对的人,你可以使用ProtectedData class

+0

我们可能必须走这条路,但我的理解是,如果我们使用ProtectedData存储我们的密钥,那么我们可以稍后再取回它。我们不想让它恢复原状,只能使用它。 – Nogwater 2010-09-29 21:35:56

+0

您只能以相同的用户身份登录后才能重新登录。 – SLaks 2010-09-29 21:59:05

+0

是的,我认为这可能对我们有用。这并不是很理想,因为我们将软件安装在一组机器上,这意味着我们需要存储的AES密钥的加密块在每台机器上会有所不同。现在我们倾向于这样:http://www.codestrider.com/BlogRead.aspx?b=d147ff4f-65e0-47f5-a39b-40ae07a42005使用公钥/私钥加密和Window的证书存储来保护真正的关键。 – Nogwater 2010-09-29 22:11:51

1

@SLaks是正确的,如果它在你的记忆中它可以被访问。你可以让它变得更加困难,但总有可能。

这就是为什么那些严肃卸载密码的人。

一个选项是smart card。这使您可以将数据移动到卡上并返回结果,但不允许访问密钥材料。它不在您的PC内存空间中,因此无法泄漏。

罗斯安德森有一篇很好的论文,Programming Satan's Computer关于这种事情。摘要:

问题是存在一个敌意的对手, 谁可以随意改变信息。实际上,我们的 任务是编写一个计算机,该计算机给出的答案是 ,它们在最不方便的时刻可能会出现错误和恶意 错误。

即使你不关心物理内存,只是硬盘和源,你仍然需要警惕虚拟内存。如果您不小心(或使用精心编写的服务),您可以在交换文件中获得纯文本密钥。这是另一个讨论这个问题的链接。不是你想这样做,但它使问题变得明显:Encrypting Virtual Memory。我相信有系统调用为此目的将内存标记为不可擦除,但我找不到链接。

+0

我们并不十分偏执,担心可以访问内存的人,仅仅是为了服务器的硬盘驱动器(包括读取我们的源代码)。 – Nogwater 2010-09-29 21:57:25

+0

增加了一点硬盘和虚拟内存 – 2010-09-30 16:07:20

+0

谢谢保罗。这很好。 – Nogwater 2010-09-30 16:31:32

0

即使对于非对称数据,如果密钥存储在计算机中并稍后使用,则在使用之前将其检索并解密。在这一点上,一个熟练的黑客可以检索它(通过捕获计算机内存并研究它)。这不是微不足道的,但仍然有可能。

通常为了解决您的问题提供了USB cryptotokens和cryptocards。这些硬件设备有自己的存储器用于存储对称密钥和非对称密钥,并且它们具有使用该密钥执行加密操作的处理器。密钥永远不会离开设备,并且实际上不可能从设备中强制提取它(存在一些硬件攻击,例如使用显微镜扫描内存,但它们比计算机上的软件攻击更复杂)。

因此,如果您的密钥真的很有价值,请使用USB cryptotoken。该设备的价格非常适中 - 每个单元大约70美元至100美元,并且有几家供应商提供这种设备。

0

要继续卸载crypto的趋势,如果您知道所有集群的硬件,如果主板上有密钥,您可以在TPM中输入密钥,这只是usb或smart-卡解决方案。

+0

我无法访问这些服务器的USB或智能卡。我们的一些盒子仍然运行Windows 2003,所以对我来说这不是一个真正的选择。是否有用于TPM的标准.NET 3.5库?也许它会对别人有用。 – Nogwater 2010-09-30 16:30:44

5

Windows DPAPI(Win32 documentation)及其.NET包装器(ProtectedData Class)不存储任何数据。相反,Windows DPAPI会返回一个加密密码值,您可以将其存储在任何地方,包括多台服务器上。

在我的工作地点,我们使用DPAPI为AES密钥生成密码,然后我们将其存储在注册表中。

Windows DPAPI的唯一目的是对数据进行加密,以便只有给定的用户帐户或机器才能解密它,而无需存储密码。

.NET ProtectedData类自2.0以来一直在.NET Framework中。

我会坚持与第三方产品的Windows DPAPI,因为它成熟,稳定,免费,易于使用,并在.NET中完全支持。

+0

只是为了确定我的理解......要在多台机器上使用ProtectedData,需要在这两台机器上都有一个共享用户帐户,这需要由域控制器提供,对吗? – Nogwater 2010-10-04 15:32:25

+4

您可以使用DPAPI在两台独立的计算机上独立加密密钥,如果需要,可以在两个不同的用户帐户下运行,只需要两个密码值不可互换即可。必须在进行加密的相同帐户(或使用基于机器的DPAPI的机器)下解密。如果你想拥有一个可以在多台机器上解密的密码,那么是的,我会说你需要一个共享帐户和一个域控制器。 – saille 2010-10-04 20:24:04

+0

感谢您的澄清。 – Nogwater 2010-10-04 22:02:48

相关问题