代码之家  ›  专栏  ›  技术社区  ›  BC.

存储加密密钥-最佳做法?

  •  59
  • BC.  · 技术社区  · 15 年前

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

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

    5 回复  |  直到 15 年前
        1
  •  58
  •   bgiles    15 年前

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

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

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

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

        2
  •  12
  •   erickson    15 年前

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

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

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

        3
  •  6
  •   sipsorcery    15 年前

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

        4
  •  4
  •   Community Bayu Bramantya    7 年前

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

    This SO question

        5
  •  2
  •   JP Alioto    15 年前

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

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

        6
  •  0
  •   Jie    3 年前

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