存储加密密钥的MD5哈希是否安全?

时间:2018-05-25 10:59:00

标签: encryption cryptography aes

以下是一个场景:

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

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

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

  • 找到碰撞的MD5字符串是没用的,因为字符串无论如何都不会与加密密钥匹配?

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

1 个答案:

答案 0 :(得分:0)

您正在描述所谓的键检查值

  

“这些假设是否正确”

是的,但是虽然MD5不能被反转,但最好使用更安全的哈希,例如SHA-256或512(在大多数运行时,这可能会令人惊讶地更快)。如果需要,您可以使用结果的最左侧字节。

  

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

好吧,有点儿;它为攻击者提供了一种方法,几乎​​可以100%确定密码/密钥一旦找到,就是正确的。如果您使用密钥进行身份验证加密(在大多数情况下建议使用密钥),也会出现这种情况。通常,您不需要为攻击者加密所有那么多数据来验证密钥的正确性。

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

注意:

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

  • 如果MD5功能本身泄漏了侧通道数据(通常没有),那么它可能会泄露攻击者的密钥。

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

  • 添加安全性的方法有很多种:使用HMAC或KBKDF,使用时间常数比较等。但一般来说散列是安全的。使用HMAC-SHA512甚至HKDF-SHA512以及特定于应用程序的输入字符串和时间常数比较,我认为是钻石标准。