侧边栏壁纸
博主头像
搭建网站的历程博主等级

生命不息,折腾不止

  • 累计撰写 36 篇文章
  • 累计创建 4 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

GO:使用TOTP

甘超良
2023-12-25 / 0 评论 / 0 点赞 / 8 阅读 / 2253 字

TOTP概念

TOTP: Time-based One-time Password Algorithm (TOTP) (RFC 6238): Time based OTP,​the most commonly used method.

  1. 基于时间戳算法生成的一次性密码,使用最广泛
  2. 基于私钥及当前时间生成
  3. 一般每30秒或60秒产生一个新口令
  4. 需要客户端与服务器保持较精确的时钟

使用

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
0

评论区