【发布时间】:2012-07-06 07:26:44
【问题描述】:
OpenSSL::HMAC#hexdigest(使用 MD5)与 Digest::MD5#hexdigest 有什么区别和/或优势?你不能只使用 Digest::MD5#hexdigest(KEY + DATA) 还是认为加密弱?
【问题讨论】:
OpenSSL::HMAC#hexdigest(使用 MD5)与 Digest::MD5#hexdigest 有什么区别和/或优势?你不能只使用 Digest::MD5#hexdigest(KEY + DATA) 还是认为加密弱?
【问题讨论】:
DATA和KEY的HMAC-MD5定义为
MD5( (K xor pad1) + H ((K xor pad2) + DATA )
其中 pad1 和 pad2 是两个固定常数。您可能会做的一些更明显的事情在密码学上很弱。
Digest::MD5.hexdigest(KEY + DATA)
有致命的缺陷。考虑 MD5 的工作原理。它将输入分成一定大小的块(md5 为 512 位)并设置一些初始状态 h0、h1、h2、h3。然后它会进行一系列转换,将第一个数据块与初始状态混合,以生成 h0、h1、h2、h3 的新值。然后将第二个数据块与那些数据组合以产生一组新的 h0、h1、h2、h3 等。哈希函数的最终值就是 h0,h1,h2,h3 的串联。
这意味着如果你给我Digest::MD5#hexdigest(KEY + DATA),那么我可以在不知道 KEY 的情况下计算出Digest::MD5#hexdigest(KEY + DATA + OTHER_DATA) 是什么。你可以用 SHA1 做同样的事情
如果你这样做了
Digest::MD5.hexdigest(DATA+KEY)
那么任何已知的 MD5 冲突都可以很容易地用于生成具有相同 HMAC 值的消息。
显然
Digest::MD5.hexdigest(KEY+DATA+KEY)
即使使用了两个不同的键,也可能存在缺陷。 HMAC 旨在缓解所有这些攻击。
【讨论】: