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

BC.*_*BC. 60 encryption configuration

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

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

bgi*_*les 56

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

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

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

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

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


eri*_*son 11

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

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

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

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


sip*_*wiz 6

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

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