python 使用hmac模塊做密鑰驗證

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章