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

Configuration 存储加密密钥--最佳实践?,configuration,encryption,Configuration,Encryption,我有一个使用对称加密算法的web应用程序 如何存储密钥和初始化向量?在代码中以文本形式存储似乎是个坏主意。应用程序设置如何?这里的最佳做法是什么?将其粘贴到web.config中,然后 更多关于web.config加密的信息应用程序启动时,您是否可以以交互方式输入密码?这样您就不必存储密钥,或者至少任何密钥(无论是对称密钥还是私钥)都可以使用此“引导”密码进行加密 如果没有,请自行将密钥存储在文件中,并修改其权限,使其仅可供运行web应用程序的用户访问 这些方法与平台无关。对于更具体的建议,有关

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


如何存储密钥和初始化向量?在代码中以文本形式存储似乎是个坏主意。应用程序设置如何?这里的最佳做法是什么?

将其粘贴到web.config中,然后


更多关于web.config加密的信息

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

如果没有,请自行将密钥存储在文件中,并修改其权限,使其仅可供运行web应用程序的用户访问

这些方法与平台无关。对于更具体的建议,有关您的平台的信息将很有帮助

顺便说一下,初始化向量应该只用于一条消息。而且IVs并没有被保密,所以你们可以把它存储在任何地方,但用一条使用它的消息来存储它是习惯性的


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

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


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

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

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

(还有更复杂的分割密钥的方法,例如,n-of-m算法,在该算法中,您不需要所有的片段来重新创建密钥,但这远远超出了您在这里需要的。)

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


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

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

@BC这里有一个关于基于密码的加密的RFC,可能很有趣,但它们读起来有点乏味:@erickson LOL你的“关于我”块中有你的公钥。在一个非技术性的说明中。。。为了使其更加安全,应选择以交互方式输入的密码,或将其分发给两(或更多)个人或物理位置。这意味着没有人知道密码。这在您认为社会工程/腐败/贿赂是一个考虑因素的情况下非常有用。如果您对web.config进行加密,您将在哪里存储他们的密钥以解密web.config?这不是一个简单的问题。您可能想查看几位安全专家的摘要,以正确地看待这个问题:“远程保存”在哪里?你能解释一下为什么这会使系统更安全吗?“文件副本会被远程保存以备任何需要的重新启动”你能详细说明一下吗?在使用PKI时,你如何以及在哪里存储私钥?确切地说!无论使用PKI还是对称密钥加密,您仍然存在密钥存储问题。因此,当同一系统或同一方需要加密和解密数据时,PKI并不能使其成为更好的解决方案。