【问题标题】:Is it safe to store an encryption key's MD5 hash?存储加密密钥的 MD5 哈希是否安全?
【发布时间】:2018-11-04 18:17:23
【问题描述】:

这是一个场景:

  • 用户输入密码
  • 使用基于密码的密钥派生算法生成 AES 密钥(大约需要一百毫秒)
  • 生成的密钥的 MD5 被暴露(存储在某处)

暴露生成的密钥的 MD5 会以某种方式降低其安全性吗?如果我理解正确:

  • 为了破解密码 - 您仍然需要先用慢速 PBKDF 从密码生成密钥,然后应用 MD5,然后检查它是否匹配来强制密码?

  • 查找冲突的 MD5 字符串将毫无用处,因为该字符串无论如何都不会匹配加密密钥?

这些假设是否正确,是否有任何方式暴露这样的字符串会影响加密安全?

【问题讨论】:

  • 您可以添加实际加密密码的步骤吗?
  • 嗯,它根本没有加密。 “pbkdf2”用于生成 AES 密钥(可用于实际使用 AES 加密内容)。问题是如果该密钥的 MD5 暴露会发生什么

标签: encryption cryptography aes


【解决方案1】:

您正在描述一个所谓的密钥检查值

“这些假设是否正确”

是的,但是虽然 MD5 无法反转,但您最好使用更安全的散列,例如 SHA-256 或 512(可能令人惊讶的是,在大多数运行时速度更快)。如果需要,您可以使用结果的最左边的 N 个字节。

“有没有办法暴露这样的字符串会影响加密安全?”

嗯,有点;它为攻击者提供了一种几乎 100% 确定密码/密钥一旦被发现是正确的验证方法。如果您使用密钥进行身份验证加密(在大多数情况下推荐),情况也是如此。通常,您不需要为攻击者加密所有数据来验证密钥的正确性。

否则不行,MD5毕竟是单向函数,因此不应该暴露任何关键位。


注意事项:

  • 当然,您不希望使用密钥作为 MD5 的输入来加密之后的任何内容。

  • 如果 MD5 函数本身泄露了侧通道数据(通常不会),那么它可能会向攻击者泄露密钥。

  • 使用安全散列创建密钥检查值可能比使用全零字节块加密更好,这是 PKCS#11 的默认 KCV 生成方法。

  • 有许多增加安全性的方法:使用 HMAC 或 KBKDF,使用时间常数比较等。但通常散列是安全的。我认为将 HMAC-SHA512 甚至 HKDF-SHA512 与应用程序特定的输入字符串和时间常数比较一起使用将是钻石标准。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    相关资源
    最近更新 更多