存储encryption密钥 – 最佳实践?
我有一个使用对称encryptionalgorithm的Web应用程序。
你将如何存储密钥和初始化向量? 在代码中作为文字存储似乎是一个坏主意。 应用程序设置如何? 这里最好的做法是什么?
webapp世界中的一个标准方法是将密钥分开并放在不同的地方。 例如,你可以拆分键,并将其中的一部分放在文件系统(“webapps”目录之外),其中的一部分以JNDIconfiguration(或.net等价物)forms存在,部分放在数据库中。 如果受到攻击,获取任何单个文件并不是特别困难,例如检查备份介质或SQL注入,但是获取所有文件将需要更多的工作。
您可以通过与相同大小的随机数字进行异或来分割一个密钥。 (使用密码强的随机数发生器!)如果要将密钥分成多个部分,可以多次重复此过程。 在你想要的过程结束时,例如,三个部分键,例如p1 ^ p2 ^ p3 = key。 您可能需要对部分密钥进行64位编码,以便它们可以正确存储,例如在JNDI属性中。
(有更复杂的方式来分割一个密钥,例如,一个n-malgorithm,你不需要所有的部分来重新创build密钥,但这是超越你所需要的。
如果您可以要求用户主动input密码,则有PBE(基于密码的encryption)algorithm将密码转换为良好的对称密钥。 你想find一个需要一个外部文件。 磁带备份或密码本身还是不够的,你需要两个。 你也可以使用这个将密码分成两部分,你可以在JNDI中使用明文密码,在文件系统中使用初始化文件。
最后,无论你做什么,都可以确保你可以很容易地重新申请你的应用程序。 一种方法是使用上面获得的密码来解密包含实际encryption密钥的另一个文件。 如果您认为这个密码已经被破解,而不需要对所有数据进行大量的重新encryption,就可以轻松地更改密码 – 只需重新encryption您的密钥即可。
是否可以在应用程序启动时交互地input密码? 这样,您不必存储密钥,或至less任何密钥(无论是对称密钥还是私钥)都可以使用此“引导”密码进行encryption。
如果没有,请将您的密钥存储在文件中,并修改其权限,以使其仅对运行该Web应用程序的用户可访问。
这些方法是平台不可知的。 对于更具体的build议,有关您的平台的信息将是有益的。
顺便说一下,初始化向量只能用于一个消息。 IV没有被保密,所以你可以把它存储在任何地方,但是把它存储到一个使用它的消息是习惯的。
我已经使用了一种方法,当我的应用程序启动时需要一个对称密钥,并在某个文件中查找它。 一旦应用程序启动,我删除该文件。 对于任何需要的重新启动,该文件的副本将被远程保存。 显然这种方法是不可行的,如果你的applciation频繁重新启动。
另一种select是证书pipe理器,如Windows证书存储。 它可以安全地存储证书和密钥,也可以将私钥标记为不可导出,因此需要进行一些严重的黑客攻击才能获得密钥。 您的应用程序可以从证书库中加载其证书,并能够调用操作来签署请求或生成新的对称密钥。 另外,您可以将权限分配给不同的certifcate商店,以便只有某些特权帐户才能访问证书。
将其粘贴在web.config中并encryption该部分
这个SO问题更多地讨论了web.configencryption