存储加密密钥 - 最佳实践?

时间:2009-04-06 23:38:45

标签: configuration encryption

我有一个使用对称加密算法的Web应用程序。

您将如何存储密钥和初始化向量?在代码中存储为文字似乎是一个坏主意。应用设置怎么样?这里的最佳做法是什么?

6 个答案:

答案 0 :(得分:53)

webapp世界中的一种标准方法是将密钥拆分并放在不同的位置。例如,您可以拆分密钥并将其中的一部分放在文件系统中(在“webapps”目录之外),其中一部分在JNDI配置中(或.net等价物),并且部分在数据库中。如果您受到损害,例如检查备份媒体或SQL注入,获取任何单件都不是特别困难,但获取所有部分将需要更多的工作。

您可以通过将密钥与相同大小的随机数进行异或来拆分密钥。 (使用加密强大的随机数生成器!)如果要将密钥拆分为多个部分,可以多次重复此过程。在您想要的过程结束时,例如,三个部分键,使得p1 ^ p2 ^ p3 = key。您可能需要对某些部分密钥进行base64编码,以便可以正确存储它们,例如,在JNDI属性中。

(有一些更复杂的方法来分割一个密钥,例如,你不需要所有的部分重新创建密钥的n-of-m算法,但这超出你所需要的范围。)

如果您可以要求用户主动输入密码,则可以使用PBE(基于密码的加密)算法将密码转换为良好的对称密钥。您想要找到一个需要外部文件的文件。再一次,磁带备份或密码本身是不够的,你需要两者。您还可以使用它将密码分成两部分,使用JNDI - 您可以在JNDI中使用明文密码短语,在文件系统中的某处使用初始化文件。

最后,无论你做什么,都要确保你能够轻松地“重新启动”你的应用程序。一种方法是使用上面获得的密码来解密包含实际加密密钥的另一个文件。如果您认为密码被泄露而不需要对所有数据进行大量重新加密,则可以轻松更改密码 - 只需重新加密您的实际密钥。

答案 1 :(得分:11)

您可以在应用程序启动时以交互方式输入密码吗?这样您就不必存储密钥,或者至少任何密钥(无论是对称密钥还是私钥)都可以使用此“引导”密码进行加密。

如果没有,请将您的密钥单独存储在文件中,并修改其权限,使其仅对运行Web应用程序的用户可访问。

这些方法与平台无关。有关更具体的建议,有关您的平台的信息会有所帮助。

顺便说一句,初始化向量应该只用于一条消息。并且IV不必保密,因此您可以将其存储在任何地方,但是将其与使用它的一条消息一起存储是习惯的。

答案 2 :(得分:6)

我使用的方法是,我的应用程序在启动时需要对称密钥,并在某个文件中查找它。应用程序启动后,我删除该文件。远程保存文件的副本以进行任何所需的重新启动。显然,如果您的applciation频繁重启,这种方法是不可行的。

另一种选择是证书管理器,例如Windows证书库。它可以安全地存储证书及其密钥,也可以将私钥标记为不可导出,因此需要一些严重的黑客才能获得密钥。您的应用程序可以从证书存储区加载其证书,并能够调用操作来签署请求或生成新的对称密钥。此外,您可以为不同的certifcate商店分配权限,以便只有某些特权帐户才能访问证书。

答案 3 :(得分:4)

将其粘贴在web.config和encrypt that section

This SO question详细介绍了web.config加密

答案 4 :(得分:2)

这应该有帮助...

http://msdn.microsoft.com/en-us/library/ms998280.aspx

但是,如果你真的想要保护你的数据,你真的应该考虑去PKI。

答案 5 :(得分:0)

我们有一个稍微不同但相关的问题。我们每隔几天就会生成一次密钥,在解密时,我们必须尝试所有的密钥,因为我们不知道加密发生在哪一天。我们所做的是再次加密密钥并将它们存储为机密。这样,我们只需要管理一组密钥。