Python:如何比较hashlib和hmac lib消息摘要

2024-10-02 18:21:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我到处找,找不到答案。我注意到我可以使用blake2b算法生成消息摘要,比如使用hashlib库或hmac库,它使用digestmod表示的hashlib。所以:

plainMsg = "this is a plaintext message"
hashlib_hashed = hashlib.blake2b(key=b'super secret key')
hashlib_hashed.update(plainMsg.encode())
hmac_hashed = hmac.new(b'super secret key', digestmod=hashlib.blake2b)
hmac_hashed.update(plainMsg.encode())

print(hashlib_hashed.hexdigest())
print(hmac_hashed.hexdigest())

在我看来,它们应该生成与我使用相同算法、相同密钥和相同明文时相同的消息摘要。但它们产生了两种不同的消化:

ec0d0ab13d7e7f3b62d742aa92078a4a14346ee6ee352e27c8814e4bf6361556fdc3d301e100b5a2c90c5596c4b2bb72c887c6b6aa92fb41752f6b52105ce13b
b632045e745550e5b9da6d411c013c978cb8120847260eb8fda9c8885368a5eaba80cd74ad95a51b1a4bde1f47cccb5a2e4591e9935126f673479c7474c2be97

一开始我认为它与盐有关,因为我没有将它与hashlib.blake2b()一起使用,所以我猜它是空的,因为salt=b''。但是使用hmac我没有找到如何设置盐。有人能解释一下吗?你知道吗


Tags: key算法消息secretupdatehmacencodehashlib
2条回答

HMAC算法不仅仅是“hash key following by message”;密钥被填充以匹配算法的块大小,然后每个字节用一个固定的“ipad”(0x36)进行异或运算,hash是从该值计算出来的,然后计算文本。然后,用一个固定的“opad”(0x5C)对原始的填充密钥进行异或运算,并再次从该新值计算哈希值,后跟上一步的哈希值。你知道吗

关键是,这并不像你想象的那么简单。您可以查看the ^{} class的内容,以查看Python在HMAC RFC之后所做的附加操作。你知道吗

您正在使用两种不同的算法来创建Message Authentication Code,即MAC。你知道吗

当您使用hmac模块时,您正在创建一个散列的MAC或HMAC。这里,密钥被使用两次(每次使用不同的XOR掩码)来预加值到数据,并且哈希函数(由hashlib库提供)被用于一次一块地处理输入数据,以便在两步处理中,首先将数据“压缩”为内部值,然后在预加第二个密钥之后将外部值。这使得算法非常灵活,因为任何块散列都可以适应这种技术。你知道吗

BLAKE2,加上一个密钥,也可以用来创建一个MAC,但是散列函数本身使用这个密钥产生一个“秘密”散列输出,一个只能用同一个密钥验证的输出,所以也产生了一个安全的签名。它通过使密钥成为迭代散列操作的第一个块来实现这一点。你知道吗

但是Blake2没有键,只是另一个散列函数,就像SHA256和其他函数一样,当你在HMAC中使用它时,不同的方法会产生不同的结果。这两种算法不兼容,因为这两种算法使用的密钥非常不同。你知道吗

引用RFC 7693 – BLAKE2 Crypto Hash and MAC

BLAKE2 does not require a special "HMAC" (Hashed Message Authentication Code) construction for keyed message authentication as it has a built-in keying mechanism.

BLAKE2 section of the ^{} documentation开始:

BLAKE2 supports keyed mode (a faster and simpler replacement for HMAC), [...]

salt函数的hashlib.blake2b()参数是BLAKE2散列算法的一个不同特性,否则只需在salt前面加上散列的明文即可。salt对输出进行“随机”处理,这样就不太可能对同一条输入消息产生两次相同的输出(这使得第三方无法检测到重复的消息)。你知道吗

相关问题 更多 >