TOTP概念
TOTP: Time-based One-time Password Algorithm (TOTP) (RFC 6238): Time based OTP,the most commonly used method.
- 基于时间戳算法生成的一次性密码,使用最广泛
- 基于私钥及当前时间生成
- 一般每30秒或60秒产生一个新口令
- 需要客户端与服务器保持较精确的时钟
使用
import "github.com/v8fg/kit4go/otp"
secret := otp.RandomSecret(10) // 生成10字节长度的 secret字符串,如: JBSWY3DPEHPK3PXP
// otp url
// otpauth://totp/Twitter:@xwi88?issuer=Twitter&secret=JJBFGV2ZGNCFARKIKBFTGUCYKA
totpURL := otp.GenerateURLTOTP(otp.KeyOpts{Issuer: "Twitter", AccountName: "@xwi88", Secret: []byte("JJBFGV2ZGNCFARKIKBFTGUCYKA")})
// now time: 2022-10-22 18:00:00 +0000 UTC
now := time.Date(2022, 10, 22, 18, 00, 00, 00, time.UTC)
// totp
// code := otp.Code("JBSWY3DPEHPK3PXP") // 527484
code := otp.Code("JBSWY3DPEHPK3PXP", now) // 527484
// totp
// code := otp.TOTPCode("JBSWY3DPEHPK3PXP") // 527484
// code := otp.TOTPCodeCustom("JBSWY3DPEHPK3PXP", now, nil) // 527484
code := otp.TOTPCodeCustom("JBSWY3DPEHPK3PXP", now, &otp.Opts{Skew: 1}) // 允许时间误差在 [Before(30s) ~ Present(30s) ~ After(30s)]
// verify
otp.VerifyTOTP(code, "JBSWY3DPEHPK3PXP") // true
otp.VerifyTOTPCustom(code, "JBSWY3DPEHPK3PXP", now, nil) // true
评论区