這是因爲hmac
使用提供的key
來生成salt並使散列更強,而hashlib
只散列提供的消息。
通過查看hmac
模塊source code,你會發現如何使用hashlib
模塊,這裏所使用的算法來實現相同的行爲hmac
(它不是原來的,我剝去一些checkings到剛纔的有趣的部分) :
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
,它不僅具有使用指定的散列算法對給定的消息進行hes,它也使用密鑰來複雜散列。
你的答案在這裏http://stackoverflow.com/questions/2836100/what-is-the-difference-between-a-hash-and-mac-message-authentication-code – Kracekumar
好的謝謝。呃DJ –