【问题标题】:Where to store encryption key在哪里存储加密密钥
【发布时间】:2011-04-30 06:02:51
【问题描述】:

我正在使用 .net 框架中的 aes 加密类对数据(医疗保健行业)进行加密。安全存储密钥的推荐位置有哪些?我在 web.config 中有它用于开发,但至少可以这么说,这感觉不值得生产。

【问题讨论】:

标签: .net asp.net encryption


【解决方案1】:

您可以使用框架中的内置方法加密您的 web.config 值:

http://weblogs.asp.net/scottgu/archive/2006/01/09/434893.aspx

这可能是存储您的密钥的合理位置 - 如果有人设法访问您的服务器以检索这些详细信息,那么您可能会有更大的担忧。

【讨论】:

  • 是的。 DPAPI 是否更“安全”?
  • @Saraz:比什么更安全?从某种意义上说,“在没有管理员级别访问特定机器的情况下无法恢复”(因为加密算法依赖于机器独有的数据),它更安全。换句话说,如果有人设法获得了您的 web.config,他们仍然无法在另一台机器上解密。
【解决方案2】:

您需要做的是将此密钥隐藏在某处,而安全位置将位于数据库中。最好是与包含您的数据的数据库不同的数据库。由于数据需要用户名/密码组合才能打开它们,因此您只需在应用程序中添加第二个安全层。您的应用程序需要登录到密钥数据库,为应用程序 Y 检索密钥 X,然后才能使用它。但是,您必须将这个数据库的连接字符串存储在某个地方。
即使您只在密钥数据库中存储一个密钥,也值得麻烦。它迫使黑客在访问数据之前打开此数据库以查找密钥需要更多的麻烦。由于没有完美的安全性,您的选择仅限于延迟黑客获得访问权限所需的时间。
加密 web.config 文件或其中的数据也有助于延迟黑客,但如果密钥在配置文件里面,他需要做的就是再次解密。

【讨论】:

  • 这与在配置文件中存储密钥并没有什么不同——您需要将连接字符串存储到您的密钥数据库的某个地方,并且如果您的黑客有足够的访问权限来访问您的配置文件,他可能会得到这个......
  • 是的。但它增加了第二层。您需要访问数据库以获取密钥,通常,数据库存储在不同的系统上。如果将数据库服务器设置为仅接受来自 Web 服务器位置的调用,则远程黑客更难获取密钥。如果数据库存储了数百个(虚拟!)密钥,那么黑客仍然不知道该使用哪一个。
【解决方案3】:

如果唯一需要将密钥用于任何目的的人可以完全信任它,那么一种可以提供良好安全性的方法是存储用另一个密钥加密的密钥,为每个用户存储一个副本,使用该用户密码的哈希加密(与存储用于密码验证的密码不同!)。即使是一个可以访问宇宙中任何地方的每一点数据、与该数据库的密钥相关联的邪恶的人,如果不对至少一个密码进行逆向工程,就无法访​​问数据库。

请注意,如果所有有效帐户的密码都丢失或忘记,则数据将无法恢复。这是真正安全性的一部分。如果想要避免丢失数据的可能性,则必须确保安全存储必要密钥和/或密码的备份副本。

【讨论】:

    【解决方案4】:

    如果应用程序需要使用您的密钥进行身份验证,那么
    Unix 机器上的常规方法是以散列形式存储密码。
    您可以使用 sha-512 + 盐。

    然后您可以在用户输入密码时计算哈希值并检查您的密码。

    如果经过哈希处理,密码/密钥本身可以存储在任何地方。 如果不将其存储在没有人可以访问的技术用户目录中。

    为那些不想花太多精力理解我提出的用例的人编辑

    Johny 有一些 AES 加密数据。
    他把钥匙放在脑袋里。
    他想将这个嘿存储在他的 PC 上的某个地方,以便自动访问。
    他可以将其作为 ASCII 码存储在 web.config 中。
    但他可以将其散列为不再是 ASCII,而是散列。
    在身份验证期间,应用程序计算哈希检查是否是正确的密钥,然后使用此密钥....
    与适当算法发生冲突的可能性低。

    ps。只是发表我对该主题的看法。
    为什么你对“哈希”这个词这么敏感???

    编辑 2
    我知道什么是哈希,
    我知道什么是所谓的2路加密......

    【讨论】:

    • 谁提到了密码?我假设 OP 想要可逆加密。
    • 确实,不是单向哈希 ;)
    • 重新编辑:不。如果您 散列 密钥,则无法从散列中恢复它(根据定义,散列是一种有损转换)。然后,您如何使用计算机上任何地方都不存在的密钥? (那个词。你一直用它。我不认为它意味着你认为它的意思。)
    • @Piskvor 来自应用程序缓存....何时发送任何超级用户身份验证隧道密钥。
    • @bua:问题不在于身份验证。他的应用程序需要加密将由另一个应用程序解密的数据。为此,他必须使用加密密钥。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 2019-03-10
    • 2012-09-06
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多