1. 程式人生 > >Google雙因子認證python最好的實現

Google雙因子認證python最好的實現

.sh 最好 object nop key dom src sel pla

這個版本應該是最好的實現,在這個上面增加四個時間點,可以用in方式進行判斷避免出錯。

@代碼的註釋其實就是最好的說明

class _GoogleTwoSetpAuth(object):
    ‘‘‘Google令牌二次認證相關‘‘‘

    def _get_hotp_token(self, secret, intervals_no):
        ‘‘‘獲取htop_token 內部方法 算法
        :param secret 二次驗證前的編碼
        :param intervals_no 時間間隔
        ‘‘‘
        key = base64.b32decode(secret, True)
        msg = struct.pack(">Q", intervals_no)
        h = hmac.new(key, msg, hashlib.sha1).digest()
        o = ord(h[19]) & 15
        h = (struct.unpack(">I", h[o:o+4])[0] & 0x7fffffff) % 1000000
        return h

    def get_totp_token(self, secret):
        ‘‘‘獲取totop
        :param secret 二次驗證前的編碼, 調用這個方法
        ‘‘‘

        # 時間樣本
        t     = time.time()
        t_30  = t + 30
        t_30_ = t -30
        t_60  = t - 60

        # 90s 的時間, 一般客戶端時間差不會超過這個,超過這個不提供方法
        oold = self._get_hotp_token(secret, intervals_no=int(t_60) // 30)
        old = self._get_hotp_token(secret, intervals_no=int(t_30_)//30)
        now = self._get_hotp_token(secret, intervals_no=int(t)//30)
        new = self._get_hotp_token(secret, intervals_no=int(t_30)//30)
        return oold, old, now, new

    def shutff_str(self):
        ‘‘‘生成隨機字符串大字16位‘‘‘
        src = "abcdefghijklmnopqrstuvwxyz".upper()
        secret= "".join(random.sample(src,16)).replace(‘ ‘,‘‘)
        return secret

Google雙因子認證python最好的實現