2011-08-04 61 views
9

在Python 2.7,爲什麼hashlib和hmac會生成不同的哈希值?

my = "my" 
key = "key" 
print(hashlib.sha256(my + key).hexdigest()) 
print(hmac.new(my, key, hashlib.sha256).hexdigest()) 

輸出,

5e50f405ace6cbdf17379f4b9f2b0c9f4144c5e380ea0b9298cb02ebd8ffe511 
15a55993a27e0de7a4c4daa67a7c219199a464ca283797f545b783cce07b38a5 

還是我誤解?

+1

你的答案在這裏http://stackoverflow.com/questions/2836100/what-is-the-difference-between-a-hash-and-mac-message-authentication-code – Kracekumar

+0

好的謝謝。呃DJ –

回答

23

這是因爲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,它也使用密鑰來複雜散列。

相關問題