2011-08-04 42 views
9

Trong Python 2.7,Tại sao hashlib và hmac lại tạo ra các giá trị băm khác nhau?

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

đầu ra,

5e50f405ace6cbdf17379f4b9f2b0c9f4144c5e380ea0b9298cb02ebd8ffe511 
15a55993a27e0de7a4c4daa67a7c219199a464ca283797f545b783cce07b38a5 

hoặc tôi đã hiểu lầm?

+1

Câu trả lời của bạn ở đây http://stackoverflow.com/questions/2836100/what-is-the-difference-between-a-hash-and-mac-message-authentication-code – Kracekumar

+0

ok cảm ơn. er dj –

Trả lời

23

Điều này là do hmac sử dụng key được cung cấp để tạo ra một salt và làm cho hàm băm mạnh hơn, trong khi hashlib chỉ băm thư được cung cấp.

Bằng cách nhìn vào hmac mô-đun source code, bạn sẽ thấy làm thế nào để đạt được các hành vi tương tự như hmac sử dụng các mô-đun hashlib, ở đây các thuật toán được sử dụng (nó không phải là một bản gốc, tôi tước một số checkings có chỉ là một phần thú vị) :

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 

cùng trực tiếp sử dụng hmac:

import hashlib 
import hmac 

result = hmac.new(KEY, MESSAGE, hashlib.sha256).hexdigest() 
print result # prints 2d93cbc1be167bcb1637a4a23cbff01a7878f0c50ee833954ea5221bb1b8c628 

Vì vậy, khi sử dụng hmac, nó không chỉ có Do đó, thông điệp đã cho bằng cách sử dụng thuật toán băm được chỉ định, nó cũng sử dụng khóa để làm phức tạp băm.

Các vấn đề liên quan