HMAC 是用于消息認(rèn)證的加密哈希算法,全稱是 keyed-Hash Message Authentication Code。HMAC 利用哈希算法,以一個(gè)密鑰和一個(gè)消息作為輸入,生成一個(gè)加密串作為輸出。HMAC 可以有效防止類似 MD5 的彩虹表等攻擊,比如將常見(jiàn)密碼的 MD5 值存入數(shù)據(jù)庫(kù),可能被反向破解。
Python 的 hmac 模塊提供了 HMAC 算法,它的使用形式是:
hmac.new(key[, msg[, digestmod]])
其中,key 是一個(gè)密鑰;msg 是消息,可選,如果給出 msg,則調(diào)用方法 update(msg);digestmod 是 HMAC 對(duì)象使用的摘要構(gòu)造函數(shù)或模塊,默認(rèn)為 hashlib.md5 構(gòu)造函數(shù)。
HMAC 對(duì)象常用的方法有:
用字符串 msg 更新 HMAC 對(duì)象,重復(fù)的調(diào)用等同于一次調(diào)用所有參數(shù)的組合,即:
m.update(a);
m.update(b);
相當(dāng)于
m.update(a+b)
返回目前傳遞給 update() 方法的字符串的摘要。此字符串長(zhǎng)度將與給構(gòu)造函數(shù)的摘要的 digest_size 相同。它可能包含非 ASCII 字符,包括 NULL 字節(jié)。
類似 digest(),但是返回的摘要的字符串的長(zhǎng)度翻倍,且只包含十六進(jìn)制數(shù)字。
現(xiàn)在,讓我們看一個(gè)簡(jiǎn)單的例子:
>>> from datetime import datetime
>>> import hashlib
>>> import hmac
>>> key = 'you-never-know'
>>> msg = datetime.utcnow().strftime('%Y-%m-%d')
>>> m = hmac.new(key, msg, hashlib.sha1)
>>> signature = m.hexdigest()
>>> signature
'fdb2087a66a2f00afbc1884738467ba089782779'