2011-08-04 10 views
9

なぜ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 

かは、私が誤解していますか? hashlibのみ提供されたメッセージをハッシュしながらhmacは、saltを生成し、ハッシュをより強くするために提供keyを使用しているため

+1

あなたの答えはこちらです。http://stackoverflow.com/questions/2836100/what-is-the-difference-between-a-hash-and-mac-message-authentication-code – Kracekumar

+0

ありがとうございました。エルDJ –

答えて

23

です。 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を使用した場合、それは持っていないだけではありません指定されたハッシングアルゴリズムを使用して指定されたメッセージを受け取り、ハッシュを複合化するためにキーを使用します。

関連する問題