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("验证失败!")
	}
}

注意事项

  1. 密钥应该安全存储,不要硬编码在代码中
  2. TOTP验证时需要考虑时间同步问题,可以设置时间容差(如±1个时间窗口)
  3. 生产环境中应该使用更长的密钥(至少16字节)
  4. 考虑使用二维码等方式分享密钥给用户

总结

otpgen库提供了简单易用的接口来生成和验证TOTP/HOTP验证码,非常适合在Go应用中实现双因素认证功能。通过合理配置参数,可以满足大多数2FA场景的需求。

完整文档请参考:otpgen GitHub仓库

回到顶部