0

0

如何在Golang中实现基础验证码功能_Golang随机生成与验证逻辑实践

P粉602998670

P粉602998670

发布时间:2026-01-04 19:11:50

|

158人浏览过

|

来源于php中文网

原创

Go语言需用crypto/rand生成安全验证码,避免rand.Intn();字符集应剔除易混淆字符,配合显式随机读取实现4–6位字母数字组合。

如何在golang中实现基础验证码功能_golang随机生成与验证逻辑实践

Go 语言本身不内置图形验证码(CAPTCHA)生成能力,但用标准库就能实现轻量、无依赖的字符型验证码——关键是控制好随机性、存储和时效性。

rand 生成安全的 4–6 位字母数字组合

别用 rand.Intn() 直接拼字符串,它默认基于非加密种子,容易被预测。必须显式调用 rand.Read() 配合 crypto/rand

import (
    "crypto/rand"
    "math/big"
)

func generateCode(length int) string {
    const chars = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789" // 去掉易混淆字符
    var code []byte
    for i := 0; i < length; i++ {
        n, _ := rand.Int(rand.Reader, big.NewInt(int64(len(chars))))
        code = append(code, chars[n.Int64()])
    }
    return string(code)
}
  • crypto/rand.Reader操作系统提供的真随机源,比 math/rand 更适合安全场景
  • 显式剔除 IO01 等易读错字符,减少用户输入投诉
  • 长度建议固定为 4 或 6 位:太短易暴力,太长影响体验且不提升实质安全性

sync.Map 或 Redis 存储验证码并设过期时间

内存存储选 sync.Map 仅适用于单机调试;生产环境必须用 Redis,否则多实例下验证必然失败:

// 示例:Redis 存储(用 github.com/go-redis/redis/v9)
client.Set(ctx, "captcha:"+sessionID, code, 5*time.Minute)
  • 键名加前缀如 captcha:,避免和其他业务 key 冲突
  • 过期时间设为 5 分钟足够——再长增加暴力重试窗口,再短引发用户反复刷新
  • 务必在验证成功后立即 Del 对应 key,防止重复使用(replay attack)
  • 如果坚持用内存,sync.Map 无法自动过期,得自己起 goroutine 定时清理,不推荐

验证时严格区分大小写并校验时效性

前端传来的验证码常带空格或换行,后端不做清洗就直接比对会失败;同时 Redis 的 GET 返回空说明已过期或不存在:

火山方舟
火山方舟

火山引擎一站式大模型服务平台,已接入满血版DeepSeek

下载

立即学习go语言免费学习笔记(深入)”;

func verifyCode(ctx context.Context, sessionID, input string) bool {
    val, err := client.Get(ctx, "captcha:"+sessionID).Result()
    if err == redis.Nil {
        return false // key 不存在(已过期或从未生成)
    }
    if err != nil {
        log.Printf("redis get error: %v", err)
        return false
    }
    return strings.TrimSpace(input) == val // 忽略首尾空白
}
  • strings.TrimSpace() 必须加,移动端软键盘常误触空格
  • 不要用 strings.EqualFold()——大小写不敏感会显著降低熵值,等同于少用一半字符集
  • Redis 返回 redis.Nil 表示 key 不存在,这是判断“过期”的唯一可靠方式,别查 TTL

真正难的不是生成那几行代码,而是存储生命周期管理:key 命名是否冲突、过期是否准时、验证后是否及时销毁、并发请求下是否出现竞态——这些细节没对齐,验证码就只是个摆设。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

177

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

225

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

336

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

207

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

388

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

194

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

189

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

191

2025.06.17

免费看漫画app合集_2026免费漫画app排行榜入口
免费看漫画app合集_2026免费漫画app排行榜入口

2026年免费漫画APP合集来啦!为你精心整理最新免费漫画APP排行榜入口,涵盖漫蛙漫画、香香漫画、包子漫画等热门神器,海量正版国漫、日漫、韩漫资源全免费阅读,无需付费解锁章节!高清全彩画质、每日极速更新,支持离线下载、智能推荐、条漫阅读模式,热血、恋爱、悬疑、古风、搞笑等题材应有尽有。无论你是追新番老粉还是小白漫迷,这里都能让你一站式追漫到爽,告别广告干扰和会员套路!赶紧点击入口下载体验,开启2026无限免费漫画之旅吧!

8

2026.01.07

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 6.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号