golang生成TOTP/HOTP验证码插件库otpgen的使用
golang生成TOTP/HOTP验证码插件库otpgen的使用
简介
otpgen是一个用于生成TOTP/HOTP验证码的Golang库。
安装
go get -u github.com/grijul/otpgen
使用示例
生成TOTP验证码
package main
import (
"fmt"
"github.com/grijul/otpgen"
)
func main() {
// 生成TOTP
totp := otpgen.TOTP{
Secret: "testpass", // 必填参数
Digits: 8, // 可选参数,默认6位
Algorithm: "SHA256", // 可选参数,默认SHA1
Period: 45, // 可选参数,默认30秒
UnixTime: 11111111, // 可选参数,默认当前Unix时间
}
if otp, err := totp.Generate(); err == nil {
fmt.Println(otp)
} else {
fmt.Println(err.Error())
}
}
生成HOTP验证码
// 生成HOTP
hotp := otpgen.HOTP{
Secret: "testsecret", // 必填参数
Counter: 100, // 计数器值,默认0
Digits: 8, // 可选参数,默认6位
}
if otp, err := hotp.Generate(); err == nil {
fmt.Println(otp)
} else {
fmt.Println(err.Error())
}
完整示例
package main
import (
"fmt"
"github.com/grijul/otpgen"
)
func main() {
// 生成TOTP
totp := otpgen.TOTP{
Secret: "testpass",
Digits: 8, //(可选) (默认: 6)
Algorithm: "SHA256", //(可选) (默认: SHA1)
Period: 45, //(可选) (默认: 30)
UnixTime: 11111111, //(可选) (默认: 当前Unix时间)
}
if otp, err := totp.Generate(); err == nil {
fmt.Println(otp)
} else {
fmt.Println(err.Error())
}
// 生成HOTP
hotp := otpgen.HOTP{
Secret: "testsecret",
Counter: 100, //(默认: 0)
Digits: 8, //(可选) (默认: 6)
}
if otp, err := hotp.Generate(); err == nil {
fmt.Println(otp)
} else {
fmt.Println(err.Error())
}
}
许可证
MIT许可证
更多关于golang生成TOTP/HOTP验证码插件库otpgen的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang生成TOTP/HOTP验证码插件库otpgen的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang TOTP/HOTP 验证码生成库 otpgen 使用指南
概述
TOTP (Time-based One-Time Password) 和 HOTP (HMAC-based One-Time Password) 是常见的双因素认证(2FA)技术。在Go语言中,otpgen
是一个简单易用的库,用于生成这两种类型的验证码。
安装
首先安装otpgen
库:
go get github.com/yaokuku123/otpgen
基本用法
1. 生成TOTP验证码
TOTP是基于时间的验证码,通常30秒更新一次:
package main
import (
"fmt"
"github.com/yaokuku123/otpgen"
"time"
)
func main() {
// 生成TOTP验证码
secret := "JBSWY3DPEHPK3PXP" // 示例密钥,实际应用中应该随机生成
code, err := otpgen.GenerateTOTP(secret, 30, 6, time.Now().Unix(), nil)
if err != nil {
fmt.Println("生成TOTP失败:", err)
return
}
fmt.Println("当前TOTP验证码:", code)
}
2. 生成HOTP验证码
HOTP是基于计数器的验证码,每次使用后计数器递增:
func generateHOTP() {
secret := "JBSWY3DPEHPK3PXP" // 示例密钥
counter := uint64(1) // 计数器值
code, err := otpgen.GenerateHOTP(secret, counter, 6, nil)
if err != nil {
fmt.Println("生成HOTP失败:", err)
return
}
fmt.Printf("HOTP验证码(计数器=%d): %s\n", counter, code)
}
高级功能
1. 生成随机密钥
实际应用中应该使用随机生成的密钥:
func generateRandomSecret() {
secret, err := otpgen.GenerateRandomSecret(16) // 16字节的随机密钥
if err != nil {
fmt.Println("生成随机密钥失败:", err)
return
}
fmt.Println("生成的随机密钥:", secret)
}
2. 验证TOTP码
func verifyTOTP() {
secret := "JBSWY3DPEHPK3PXP"
userCode := "123456" // 假设用户输入的验证码
valid, err := otpgen.ValidateTOTP(userCode, secret, 30, 6, time.Now().Unix(), 1, nil)
if err != nil {
fmt.Println("验证失败:", err)
return
}
if valid {
fmt.Println("验证码有效")
} else {
fmt.Println("验证码无效")
}
}
3. 自定义哈希算法
默认使用SHA1,但可以指定其他算法:
func customHash() {
secret := "JBSWY3DPEHPK3PXP"
hash := otpgen.SHA256 // 也可以使用 SHA1 或 SHA512
code, err := otpgen.GenerateTOTP(secret, 30, 6, time.Now().Unix(), &otpgen.Options{
Hash: hash,
})
if err != nil {
fmt.Println("生成TOTP失败:", err)
return
}
fmt.Println("使用SHA256的TOTP验证码:", code)
}
实际应用示例
1. 完整的TOTP生成与验证流程
func fullTOTPExample() {
// 1. 生成随机密钥
secret, err := otpgen.GenerateRandomSecret(16)
if err != nil {
fmt.Println("生成密钥失败:", err)
return
}
fmt.Println("你的密钥:", secret)
// 2. 生成当前TOTP码
code, err := otpgen.GenerateTOTP(secret, 30, 6, time.Now().Unix(), nil)
if err != nil {
fmt.Println("生成TOTP失败:", err)
return
}
fmt.Println("当前验证码:", code)
// 3. 模拟用户输入
var userInput string
fmt.Print("请输入验证码: ")
fmt.Scanln(&userInput)
// 4. 验证
valid, err := otpgen.ValidateTOTP(userInput, secret, 30, 6, time.Now().Unix(), 1, nil)
if err != nil {
fmt.Println("验证失败:", err)
return
}
if valid {
fmt.Println("验证成功!")
} else {
fmt.Println("验证失败!")
}
}
注意事项
- 密钥应该安全存储,不要硬编码在代码中
- TOTP验证时需要考虑时间同步问题,可以设置时间容差(如±1个时间窗口)
- 生产环境中应该使用更长的密钥(至少16字节)
- 考虑使用二维码等方式分享密钥给用户
总结
otpgen
库提供了简单易用的接口来生成和验证TOTP/HOTP验证码,非常适合在Go应用中实现双因素认证功能。通过合理配置参数,可以满足大多数2FA场景的需求。
完整文档请参考:otpgen GitHub仓库