为什么hashlib和hmac生成不同的哈希值?
在Python 2.7中,
my = "my"
key = "key"
print(hashlib.sha256(my + key).hexdigest())
print(hmac.new(my, key, hashlib.sha256).hexdigest())
输出结果是,
5e50f405ace6cbdf17379f4b9f2b0c9f4144c5e380ea0b9298cb02ebd8ffe511
15a55993a27e0de7a4c4daa67a7c219199a464ca283797f545b783cce07b38a5
还是我理解错了?
1 个回答
28
这是因为 hmac
会用提供的 key
来生成一个叫做 盐 的东西,从而让哈希变得更强,而 hashlib
只是简单地对提供的信息进行哈希处理。
通过查看 hmac
模块的 源代码,你会发现如何用 hashlib
模块实现和 hmac
一样的功能。这里用到的算法(这不是原始的,我去掉了一些检查,只保留了有趣的部分):
import hashlib
MESSAGE = "msg"
KEY = "key"
trans_5C = "".join ([chr (x ^ 0x5C) for x in xrange(256)])
trans_36 = "".join ([chr (x ^ 0x36) for x in xrange(256)])
outer = hashlib.sha256()
inner = hashlib.sha256()
KEY = KEY + chr(0) * (inner.block_size - len(KEY))
outer.update(KEY.translate(trans_5C))
inner.update(KEY.translate(trans_36))
inner.update(MESSAGE)
outer.update(inner.digest())
result = outer.hexdigest()
print result # prints 2d93cbc1be167bcb1637a4a23cbff01a7878f0c50ee833954ea5221bb1b8c628
直接使用 hmac
的方式:
import hashlib
import hmac
result = hmac.new(KEY, MESSAGE, hashlib.sha256).hexdigest()
print result # prints 2d93cbc1be167bcb1637a4a23cbff01a7878f0c50ee833954ea5221bb1b8c628
所以,当使用 hmac
的时候,它不仅仅是用指定的哈希算法对给定的信息进行哈希处理,还会用这个密钥来让哈希变得更复杂。