Python學習筆記__12.6章 hmac
1、概覽
如果salt是我們自己隨機生成的,通常我們計算MD5時采用md5(message + salt)。這實際上就是Hmac算法:Keyed-Hashing for Message Authentication。它通過一個標準算法,在計算哈希的過程中,把key混入計算過程中。
Hmac算法針對所有哈希算法都通用,無論是MD5還是SHA-1。采用Hmac替代我們自己的salt算法,可以使程序算法更標準化,也更安全。
hmac模塊實現了標準的Hmac算法,它利用一個key對message計算“雜湊”後的hash,使用hmac算法比標準hash算法更安全,因為針對相同的message,不同的key會產生不同的hash
>>> import hmac
>>> message = b'Hello, world!'
>>> key = b'secret'
>>> h = hmac.new(key, message, digestmod='MD5')
>>> # 如果消息很長,可以多次調用h.update(msg)
>>> h.hexdigest()
'fa4ee7d173f2d97ee79022d1a7355bcf'
hmac輸出的長度和原始哈希算法的長度一致。需要註意
2、例子
將上一節的salt改為標準的hmac算法,驗證用戶口令:
# -*- coding: utf-8 -*-
import hmac, random
def hmac_md5(key, s):
return hmac.new(key.encode('utf-8'), s.encode('utf-8'), 'MD5').hexdigest()
class User(object):
def __init__(self, username, password):
self.username = username
self.key = ''.join([chr(random.randint(48, 122)) for i in range(20)])
self.password = hmac_md5(self.key, password)
db = {
'michael': User('michael', '123456'),
'bob': User('bob', 'abc999'),
'alice': User('alice', 'alice2008')
}
def login(username, password):
user = db[username]
return user.password == hmac_md5(user.key, password)
Python學習筆記__12.6章 hmac