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