使用pyotp實現OTP一次性密碼驗證
OTP的基本原理
- 生成一個共享秘鑰作為隨機數的種子
- 服務端通過種子計算出當前的密碼
- 客戶端也通過相同的種子計算出當前的密碼
- 驗證客戶端生成的密碼和服務端生成的密碼是否匹配
服務端和客戶端計算的方式一樣
共享密鑰 + 時間因子 + 算法 => 密碼結果
文檔
- https://github.com/pyauth/pyotp
- https://github.com/tadeck/onetimepass/
- https://pyauth.github.io/pyotp/
安裝
pip install pyotp
基本使用示例
import pyotp# 秘鑰
secret_key = 'S5MPVVK6TYBAYJTKEWW5UGDSC2NX6OPS'totp = pyotp.TOTP(secret_key)# 生成一個隨機密碼
totp.now() # => '492039'# 驗證
totp.verify('198361') # 返回 True或False
秘鑰有一定的規則,可以使用pyotp提供的方法生成一個隨機秘鑰
secret_key = pyotp.random_base32() # S5MPVVK6TYBAYJTKEWW5UGDSC2NX6OPS
生成一個url,使用Google Authenticator掃描
# 生成一個url,使用Google Authenticator掃描
print(totp.provisioning_uri(name='alice@google.com', issuer_name='Secure App'))
# otpauth://totp/Secure%20App:alice%40google.com?secret=S5MPVVK6TYBAYJTKEWW5UGDSC2NX6OPS&issuer=Secure%20App
比如使用https://cli.im/text 生成二維碼如下
參考
- Python使用otp實現二步驗證