hmac模塊(僅在python3中可以使用)
簡介:
HMAC是密鑰相關的哈希運算消息認證碼,HMAC運算利用哈希算法,以一個密鑰和一個消息爲輸入,生成一個消息摘要作爲輸出。
典型應用:
HMAC的一個典型應用是用在“質疑/應答”(Challenge/Response)身份認證中。
認證流程:
(1) 先由客戶端向服務器發出一個驗證請求。
(2) 服務器接到此請求後生成一個隨機數並通過網絡傳輸給客戶端(此爲質疑)。
(3) 客戶端將收到的隨機數提供給ePass,由ePass使用該隨機數與存儲在ePass中的密鑰進行HMAC-MD5運算並得到一個結果作爲認證證據傳給服務器(此爲響應)。
(4) 與此同時,服務器也使用該隨機數與存儲在服務器數據庫中的該客戶密鑰進行HMAC-MD5運算,如果服務器的運算結果與客戶端傳回的響應結果相同,則認爲客戶端是一個合法用戶。
生成token:
import time
import base64
import hmac
def generate_token(key, expire=60):
"""
@Args:
key: str (用戶給定的key,需要用戶保存以便之後驗證token,每次產生token時的key 都可以是同一個key)
expire: int(最大有效時間,單位爲s)
@Return:
state: str
:param key:
:param expire:
:return:
"""
ts_str = str(time.time() + expire)
ts_byte = ts_str.encode("utf-8")
sha1_tshex_str = hmac.new(key.encode("utf-8"), ts_byte, 'sha1').hexdigest()
token = ts_str+':'+sha1_tshex_str
b64_token = base64.urlsafe_b64encode(token.encode("utf-8"))
return b64_token.decode("utf-8")
驗證token:
def certify_token(key, token):
"""
@Args:
key: str
token: str
@Returns:
boolean
:param key:
:param token:
:return:
"""
token_str = base64.urlsafe_b64decode(token).decode('utf-8')
token_list = token_str.split(':')
if len(token_list) != 2:
return False
ts_str = token_list[0]
if float(ts_str) < time.time():
return False
known_sha1_tsstr = token_list[1]
sha1 = hmac.new(key.encode("utf-8"), ts_str.encode('utf-8'), 'sha1')
calc_sha1_tsstr = sha1.hexdigest()
if calc_sha1_tsstr != known_sha1_tsstr:
# token certification failed
return False
# token certification success
return True