我到处找,找不到答案。我注意到我可以使用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
我没有找到如何设置盐。有人能解释一下吗?你知道吗
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 section of the ^{} documentation 开始:
salt
函数的hashlib.blake2b()
参数是BLAKE2散列算法的一个不同特性,否则只需在salt前面加上散列的明文即可。salt对输出进行“随机”处理,这样就不太可能对同一条输入消息产生两次相同的输出(这使得第三方无法检测到重复的消息)。你知道吗相关问题 更多 >
编程相关推荐