1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      GoogleAuthenticatorTOTP原理和代碼示例-創(chuàng)新互聯(lián)

      這篇文章主要介紹了Google Authenticator TOTP的原理以及使用代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。

      創(chuàng)新互聯(lián)始終堅(jiān)持【策劃先行,效果至上】的經(jīng)營理念,通過多達(dá)10余年累計(jì)超上千家客戶的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的全網(wǎng)營銷解決方案,現(xiàn)已廣泛運(yùn)用于各行各業(yè)的客戶,其中包括:成都搬家公司等企業(yè),備受客戶贊美。

      話不多說,一起往下看吧。

      一、 原理詳解(點(diǎn)擊圖片然后放大查看)
      Google Authenticator TOTP原理和代碼示例

      二、  驗(yàn)證
      1、下載Google谷歌身份驗(yàn)證器。
      2、通過Python 的qrcode和pyotp模塊生成二維碼。
      Google Authenticator TOTP原理和代碼示例

      3、然后使用下載的谷歌身份驗(yàn)證器掃描生成的二維碼

      如果沒有谷歌服務(wù),則選擇輸入秘鑰,在賬戶明處填入name參數(shù),在秘鑰處填入Secret即可。

      4、對比手機(jī)上谷歌驗(yàn)證器顯示的6位動(dòng)態(tài)碼,你會(huì)發(fā)現(xiàn),代碼計(jì)算處的6位動(dòng)態(tài)碼是一致的

      三、 源碼

      1、計(jì)算Google Authenticator 6位動(dòng)態(tài)碼

      #!/usr/bin/env python
      # -*- coding:utf-8 -*-
      # Google Authenticator工作原理 TOTP(Time-Based One-Time Password)
      
      import hmac
      import hashlib
      import base64
      import struct
      import time
      
      # setup 1 : base32 secret
      # 提示:Secret的長度最好不要超過32
      Secret = 'userxiaosheng'
      
      # Secret += '=' * (8-len(Secret)%8) # py3中base64模塊要求字符串必須為8的倍數(shù),不足部分使用 = 補(bǔ)全
      # 在查閱相關(guān)資料時(shí),發(fā)現(xiàn)解決【可以將Key進(jìn)行b3decode】的代碼都是這樣寫的(或者類似).
      # 但是在生產(chǎn)環(huán)境中,為了給每個(gè)用戶生成不一樣的Key,我們必須通過各種算法,生成一個(gè)和用戶有關(guān)的字符串作為Key使用,
      # 如果你使用的是 Secret += '=' * (8-len(Secret)%8) 這種方式解決b32decode問題,那么當(dāng)Key中有數(shù)字時(shí),
      # b32decode將會(huì)報(bào)錯(cuò):binascii.Error: Non-base32 digit found,
      # 通過測試,我找到了一段代替Secret += '=' * (8-len(Secret)%8)的代碼,所以在我這篇文章中,
      # 將會(huì)使用Secret = base64.b32encode(s=Secret.encode('utf-8'))來代替類似Secret += '=' * (8-len(Secret)%8) 的代碼.
      
      Secret = base64.b32encode(s=Secret.encode('utf-8'))
      K = base64.b32decode(Secret,True)
      
      # setup 2 : get current timestamp
      # int(time.time()) // 30  到當(dāng)前經(jīng)歷了多少個(gè)30秒
      C = struct.pack(">Q", int(time.time()) // 30)   # 將間隔時(shí)間轉(zhuǎn)為big-endian(大端序)并且為長整型的字節(jié)
      
      # setup 3 : start hmac-sha1
      # hmac = SHA1(secret + SHA1(secret + input))
      H = hmac.new(K,C,hashlib.sha1).digest() # 使用hmac sha1加密,并且以字節(jié)的方式取出 = b'\x0f\x1a\xaeL\x0c\x8e\x19g\x8dv}\xde7\xbc\x95\xeal\xa3\xc1\xee'
      O = H[19] & 15  # bin(15)=00001111=0b1111
      
      DynamicPasswd = str((struct.unpack(">I", H[O:O+4])[0] & 0x7fffffff) % 1000000)
      # struct.unpack('>I',h[o:o+4])[0]   -- 轉(zhuǎn)為big-endian(大端序)并且不為負(fù)數(shù)的數(shù)字(整數(shù)),因?yàn)檗D(zhuǎn)換完是一個(gè)數(shù)組,類似"(2828101188,)",所以需要[0]取出
      # h[o:o+4]  --  取其中4個(gè)字節(jié)  o=10  則取索引分別為 10,11,12,13的字節(jié)
      # & 0x7fffffff = 11111111  --  與字節(jié)轉(zhuǎn)換的數(shù)字做與運(yùn)算
      # % 1000000  --  得出的數(shù)字與1000000相除然后取余
      
      TOTP = str(0) + str(DynamicPasswd) if len(DynamicPasswd) < 6 else DynamicPasswd
      # passwd = passwd if len(passwd) < 6 else str(0) + str(passwd)
      # 如果最后得出的6位數(shù)字,首位0,可能會(huì)只輸出5位數(shù)字,所以這里進(jìn)行一個(gè)判斷,如果是5位則加上首位的0
      print(TOTP)

      2、生成二維碼

      import pyotp
      from qrcode import QRCode
      from qrcode import constants
      
      Secret = 'userxiaosheng'
      Secret = base64.b32encode(s=Secret.encode('utf-8'))
      Content = pyotp.totp.TOTP(Secret).provisioning_uri(name='xiaosheng', issuer_name="Verfiy Code")
      # 在真實(shí)環(huán)境中,name的參數(shù)應(yīng)該是和Secret有關(guān)聯(lián)的,這樣我們才能為每個(gè)不同的用戶分別計(jì)算動(dòng)態(tài)驗(yàn)證碼.
      
      qr = QRCode(version=1,
                  error_correction=constants.ERROR_CORRECT_L,
                  box_size=6,
                  border=4,)
      
      qr.add_data(Content)
      qr.make(fit=True)
      img = qr.make_image()
      img.save('./GoogleQR.png')

      關(guān)于Google Authenticator TOTP的原理以及使用代碼示例就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果喜歡這篇文章,不如把它分享出去讓更多的人看到。

      創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。


      本文標(biāo)題:GoogleAuthenticatorTOTP原理和代碼示例-創(chuàng)新互聯(lián)
      當(dāng)前URL:http://ef60e0e.cn/article/dgegsd.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        紫阳县| 闽清县| 藁城市| 平江县| 恩施市| 遂溪县| 柘荣县| 双辽市| 涪陵区| 金门县| 清镇市| 思南县| 綦江县| 肃北| 灵石县| 七台河市| 淮阳县| 成武县| 阳信县| 吉林省| 石林| 阳东县| 宜黄县| 蒙自县| 青阳县| 仁怀市| 沽源县| 广饶县| 兴化市| 桃江县| 栖霞市| 尉氏县| 西贡区| 南康市| 台湾省| 冕宁县| 土默特右旗| 日照市| 泌阳县| 东平县| 洱源县|