2011-08-04 2 views
9

,hashlib와 hmac가 다른 해시 값을 생성하는 이유는 무엇입니까? 파이썬 2.7에서

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를 사용하는 경우, 그것은이 아니라 않습니다 지정된 해시 알고리즘을 사용하여 지정된 메시지를 수신하면 해시를 복합화하기 위해 키를 사용합니다.

관련 문제