time-based基於google key生成6位驗證碼(google authenticator)

烏火寒客發表於2018-12-07

由於公司伺服器啟用了雙因子認證,登入時需要再次輸入谷歌身份驗證器生成的驗證碼。而生成驗證碼是基於固定的演算法的,以當前時間為基礎,基於每個人的google key去生成一個6位的驗證碼。也就是說,只要是這個key,只要處於當前這個時間,生成的一定是這6位數字。

以下為python3實現

import hmac
import base64
import struct
import hashlib
import time


def cal_google_code(secret_key):
    duration_input = int(time.time())//30
    key = base64.b32decode(secret_key)  # Length of the key must be a multiplier of eight
    msg = struct.pack(">Q", duration_input)
    google_code = hmac.new(key, msg, hashlib.sha1).digest()
    o = google_code[19] & 15
    google_code = str((struct.unpack(">I", google_code[o:o+4])[0] & 0x7fffffff) % 1000000)
    if len(google_code) == 5:  # Only if length of the code is 5, a zero will be added at the beginning of the code.
        google_code = `0` + google_code
    return google_code

 

這段演算法有兩個要點。

首先演算法對google key的長度是有要求的,key的長度必須是8的倍數。所以如果運維給的key不符合要求,需要在後面補上相應個數的”=”。

其次,按照此演算法,生成的驗證碼未必是6位,注意要在前面補0。

相關文章