以下是一个场景:
暴露MD5的生成密钥会以某种方式降低其安全性吗?如果我理解正确:
为了破解密码 - 您仍然需要通过首先使用慢速PBKDF生成密钥,应用MD5然后检查它是否匹配来强制密码?
找到碰撞的MD5字符串是没用的,因为字符串无论如何都不会与加密密钥匹配?
这些假设是否正确,是否有任何方式暴露此类字符串会影响加密安全性?
答案 0 :(得分:0)
您正在描述所谓的键检查值。
“这些假设是否正确”
是的,但是虽然MD5不能被反转,但最好使用更安全的哈希,例如SHA-256或512(在大多数运行时,这可能会令人惊讶地更快)。如果需要,您可以使用结果的最左侧字节。
好吧,有点儿;它为攻击者提供了一种方法,几乎可以100%确定密码/密钥一旦找到,就是正确的。如果您使用密钥进行身份验证加密(在大多数情况下建议使用密钥),也会出现这种情况。通常,您不需要为攻击者加密所有那么多数据来验证密钥的正确性。“有没有办法暴露这样的字符串会影响加密安全性?”
否则不行,MD5毕竟是单向函数,因此不应暴露任何关键位。
注意:
当然,您不希望使用密钥作为MD5的输入来加密任何内容。
如果MD5功能本身泄漏了侧通道数据(通常没有),那么它可能会泄露攻击者的密钥。
使用安全散列创建密钥检查值可能比使用所有零字节块的加密更好,这是PKCS#11的默认KCV生成方法。
添加安全性的方法有很多种:使用HMAC或KBKDF,使用时间常数比较等。但一般来说散列是安全的。使用HMAC-SHA512甚至HKDF-SHA512以及特定于应用程序的输入字符串和时间常数比较,我认为是钻石标准。