背景
- 最近用到了OTP, 遂mark一下
OTP
- 動态密碼驗證可以看作是服務端和用戶端之間通過約定相同的算法來實作驗證功能, 也即你在用戶端看到的動态密碼是用戶端通過算法生成的無需請求服務端擷取
TOTP
- 平時用的google動态密碼用的就是TOTP(
), TOTP基于HOTP, 是以弄懂TOTP即可Time-based One-Time Password
- 原理: 假設用的是30秒間隔的六位密碼, 精簡版僞代碼:
// secret為密碼, timestamp為時間戳, 傳回密碼
GetOTPCode(secret, timestamp) {
hs = hmac(secret, timestamp/30)
// hsToInt是對hs這個[]byte進行各種&與偏移操作然後轉為int
intHs = hsToInt(hs)
code = intHs % 1000000
return code
}
庫
- golang-gootp
- python-pyotp
參考
- RFC 4226 (HOTP)
- RFC 6238 (TOTP)
- 動态令牌-(OTP,HOTP,TOTP)-基本原理