ruby中OpenSSL::HMAC#hexdigest与Digest::MD5#hexdigest的区别?

ruby中OpenSSL::HMAC#hexdigest与Digest::MD5#hexdigest的区别?,ruby,openssl,md5,Ruby,Openssl,Md5,OpenSSL::HMAC#hexdigest(使用MD5)与Digest::MD5#hexdigest的区别和/或优势是什么?你不能只使用文摘::MD5*HeX文摘(Key +数据)还是认为密码弱?p> 数据和密钥的HMAC-MD5定义为 MD5( (K xor pad1) + H ((K xor pad2) + DATA ) 其中pad1和pad2是两个固定常数。您可能会做的一些更明显的事情在加密方面很弱 Digest::MD5.hexdigest(KEY + DATA) 它有致命的缺陷

OpenSSL::HMAC#hexdigest(使用MD5)与Digest::MD5#hexdigest的区别和/或优势是什么?你不能只使用文摘::MD5*HeX文摘(Key +数据)还是认为密码弱?p> 数据和密钥的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(键+数据)
,那么我可以在根本不知道键的情况下计算
Digest::MD5#hexdigest(键+数据+其他数据)
是什么。你可以用SHA1做同样的事情

如果你这样做了

Digest::MD5.hexdigest(DATA+KEY)
然后,MD5中的任何已知冲突都可以轻松地用于生成具有相同HMAC值的消息

显然

Digest::MD5.hexdigest(KEY+DATA+KEY)
也可能有缺陷,即使使用了两个不同的键。HMAC旨在减轻所有这些攻击