【问题标题】:HMAC SHA256 in Python: HMAC Library vs Hashlib Produces Different ResultsPython 中的 HMAC SHA256:HMAC 库与 Hashlib 产生不同的结果
【发布时间】:2020-09-26 03:45:23
【问题描述】:

所以我一直在查看 Wikipedia 的 HMAC 伪代码,它看起来相对简单;如果您的密钥大小已经是块大小,则伪代码归结为 3 行:

    o_key_pad ← key xor [0x5c * blockSize]   // Outer padded key
    i_key_pad ← key xor [0x36 * blockSize]   // Inner padded key

    return hash(o_key_pad ∥ hash(i_key_pad ∥ message))

这很容易翻译成 Python:

ik = bytes([0x36 ^ b for b in k])
ok = bytes([0x5c ^ b for b in k])

print(hashlib.sha256(ok + bytearray.fromhex(hashlib.sha256(ik+msg).hexdigest())).hexdigest())

但这与使用 Python 的 HMAC 库产生的结果不同:

p = bytes("password", encoding='utf8')
k = bytearray.fromhex("eae1f9b8c78d0e0dbaeb3bc49fea3f0be9e9dc580c0b0ba09bcf5104713fda80")

x = hmac.new(k, digestmod='sha256')
x.update(p)
print(x.hexdigest())

ik = bytes([0x36 ^ b for b in k])
ok = bytes([0x5c ^ b for b in k])
print(hashlib.sha256(ok + bytearray.fromhex(hashlib.sha256(ik+p).hexdigest())).hexdigest())

最终生产

1b96a6d3473698c3592a99d752934b875f82cdd623230abc534f92e7b70cc251 57dcbe4ada890bcc8d3cc2e6072874e0d1a0d6d3f73ceb1ced8dad4f07b56e33

为什么?

【问题讨论】:

    标签: python cryptography sha256 hmac


    【解决方案1】:

    在自定义实现中缺少块大小的键填充,请参阅here

    比 blockSize 短的键通过在右侧填充零来填充到 blockSize

    SHA256的块大小为64字节,见here

    以下 ptyhon 代码产生预期的结果:

    import hmac 
    import hashlib
    
    p = bytes("password", encoding='utf8')
    k = bytearray.fromhex("eae1f9b8c78d0e0dbaeb3bc49fea3f0be9e9dc580c0b0ba09bcf5104713fda80")
    
    x = hmac.new(k, digestmod='sha256')
    x.update(p)
    print(x.hexdigest())
    
    k = bytearray.fromhex("eae1f9b8c78d0e0dbaeb3bc49fea3f0be9e9dc580c0b0ba09bcf5104713fda80".ljust(128,'0')) # pad with zeros
    ik = bytes([0x36 ^ b for b in k])
    ok = bytes([0x5c ^ b for b in k])
    print(hashlib.sha256(ok + bytearray.fromhex(hashlib.sha256(ik+p).hexdigest())).hexdigest())
    

    输出:

    1b96a6d3473698c3592a99d752934b875f82cdd623230abc534f92e7b70cc251
    1b96a6d3473698c3592a99d752934b875f82cdd623230abc534f92e7b70cc251
    

    也可以验证here

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 2020-10-18
      • 2020-10-19
      • 2018-05-25
      • 2015-09-07
      • 1970-01-01
      相关资源
      最近更新 更多