python 使用hmac模組做金鑰驗證

2021-10-06 10:57:22 字數 2192 閱讀 2021

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

defgenerate_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(

':')

iflen

(token_list)!=2

:return

false

ts_str = token_list[0]

iffloat

(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

第十章 hashlib模組和hmac模組

目錄hash是一種演算法,接收傳入的內容,經過運算得到的一串hash值 hash的特點 具有唯一性 安全性,可以用於儲存非明文密碼 無論傳入的什麼內容,返回的hash值長度都是固定的 import hashlib m hashlib.md5 建立了hash物件 print type m m.upda...

python模組使用 python 模組發布及使用

將模組 此處名為nester 寫好後,與setup.py放入同乙個資料夾中 from distutils.core importsetup setup name 發布名,一般同模組名 version 版本號 py modules 模組列表 引數,其他引數根據需求新增 構建發布檔案 在資料夾下開啟終端...

Python使用模組Pyserial模組報

用pip安裝pyserial後 sudo h pip install pyserial,執行新建的程式,名稱為serial.py,程式中用到 import serial.toos.list ports,但總是提示importerror no module named tools.list ports...