【问题标题】:Python: how to compare hashlib lib and hmac lib message digestsPython:如何比较 hashlib lib 和 hmac lib 消息摘要
【发布时间】:2019-08-23 00:47:51
【问题描述】:

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

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 我没有找到如何设置盐。那么,谁能解释一下?

【问题讨论】:

    标签: python hmac digest hashlib


    【解决方案1】:

    HMAC 算法不仅仅是“散列密钥后跟消息”;密钥被填充以匹配算法的块大小,然后每个字节与一个固定的“ipad”(0x36)进行异或,哈希是根据该值和文本计算得出的。然后将原始填充键与固定的“opad”(0x5C)进行异或运算,然后再次根据该新值计算哈希值,然后再计算上一步的哈希值。

    重点是,它并不像您想象的那么简单。您可以查看 the hmac.HMAC class 的内容,了解 Python 为遵循 HMAC RFC 所做的额外复杂操作。

    【讨论】:

      【解决方案2】:

      您正在使用两种不同算法来创建Message Authentication Code 或 MAC。

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

      BLAKE2,有一个密钥,也可以用来创建一个 MAC,但它是哈希函数本身,然后使用该密钥产生一个“秘密”哈希输出,一个只能使用相同的密钥进行验证,因此也可以生成安全签名。它通过将密钥作为迭代散列操作的第一个块来做到这一点。

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

      引用RFC 7693 – BLAKE2 Crypto Hash and MAC:

      BLAKE2 不需要 特殊的“HMAC”(散列消息验证码)结构 用于键控消息身份验证,因为它具有内置键控 机制。

      来自BLAKE2 section of the hashlib documentation

      BLAKE2 支持键控模式(一种更快、更简单的 HMAC 替代品),[...]

      hashlib.blake2b() 函数的 salt 参数是 BLAKE2 散列算法的不同功能,否则您只需在盐前面加上散列明文即可。盐“随机化”输出,因此极不可能为相同的输入消息两次产生相同的输出(使第 3 方无法检测到重复的消息)。

      【讨论】:

        猜你喜欢
        • 2018-02-28
        • 1970-01-01
        • 1970-01-01
        • 2020-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多