Почему 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

или я неправильно понял?


person Er Dj    schedule 04.08.2011    source источник
comment
Ваш ответ здесь stackoverflow.com/questions/2836100/   -  person Kracekumar    schedule 04.08.2011


Ответы (1)


Это связано с тем, что hmac использует предоставленный key для создания соли и делает хэш более strong, в то время как hashlib только хэширует предоставленное сообщение.

Просмотрев исходный код модуля hmac, вы узнаете, как чтобы добиться того же поведения, что и hmac, используя модуль hashlib, вот используемый алгоритм (это не оригинальный, я удалил некоторые проверки, чтобы иметь только интересную часть):

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 он не только хэширует данное сообщение с использованием указанного алгоритма хеширования, но также использует ключ для усложнения хэша.

person mdeous    schedule 04.08.2011