这是因为hmac
使用提供key
的来生成盐并使散列更强大,而hashlib
仅对提供的消息进行散列。
通过查看hmac
模块源代码,您会发现如何实现与hmac
使用hashlib
模块相同的行为,这里是使用的算法(它不是原始算法,我去掉了一些检查,只剩下有趣的部分):
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
,它不仅使用指定的散列算法对给定消息进行散列,还使用密钥来复杂化散列。