go版本,google-authenticator动态口令算法,二次安全校验

go版本,google-authenticator动态口令算法,二次安全校验

登录安全二次校验,可以有效的提升账户安全等级,目前常用的方法:手机短信二次校验、动态口令
本文介绍google-authenticator动态口口令算法,以及加解密以及二维码生成
动态安全口令,秘钥一般通过二维码少吗形式自动获得

系统身份认证快速升级:
活体人脸实名认证H5版,让您的系统身份认证更人性化

一、生成和解密秘钥

随机生成字符串,加密转成base32,encoding.go

package mainimport ("crypto/rand""fmt""log""strconv""strings"
)// Base32 字符表 33个字符
var Base32Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567="// SourceCreatSecret 生成秘钥:长度在16~128之间,从允许的base32字符中随机选择。
func SourceCreatSecret(secretLen int) string {// 有效的秘密长度是80到640位:16*5~128*5,base32每个5位一个字节if secretLen<16 || secretLen >128{log.Fatalln("随机字符长度异常:16~128")}randomBytes := make([]byte, secretLen)_, err := rand.Read(randomBytes)if err != nil {log.Fatalln("随机字符异常:", err.Error())}var secret stringfor _, i := range randomBytes {secret += string(Base32Chars[i&31])}return secret
}// SourceDecodeSecret 解码 Base32 编码的字符串
func SourceDecodeSecret(secret string) string {padChar := Base32Chars[32:]paddingCharCount := strings.Count(secret, padChar)allowedValues := []int{6, 4, 3, 1, 0}if !InArray(paddingCharCount, allowedValues) {log.Fatalln("填充字符数量错误:", paddingCharCount)}// 校验秘钥带的填充字符数量,与实际应该填充的字符是否相同for i := 0; i < 4; i++ {if paddingCharCount == allowedValues[i] {if secret[strings.Index(secret, padChar):] != strings.Repeat(padChar, allowedValues[i]) {log.Fatalln("填充字符错误:", secret[strings.Index(secret, padChar):])}}}secret = strings.Replace(secret, "=", "", -1)// 每 8 个字符进行分组解码var strs []bytefor i := 0; i < len(secret); i += 8 {var x string// 查看当前字符是否是合法字符if !strings.Contains(Base32Chars, string(secret[i])) {log.Fatalln("秘钥包含非法字符:", string(secret[i]))}// 将当前的8个字符转成二进制、拼接在一起,空值使用0for j := 0; j < 8; j++ {// 将字符转成二进制if len(secret) > (i + j) {x += fmt.Sprintf("%05b", strings.Index(Base32Chars, string(secret[i+j])))} else {x += fmt.Sprintf("%05b", 0)}}l := len(x)for i := 0; i < l; i += 8 {end := i + 8if end > l {end = l}}for i := 0; i < len(x)/8; i++ {it, _ := strconv.ParseInt(x[i*8:(i+1)*8], 2, 64)strs = append(strs, uint8(it))}}return string(strs)
}

2、生成动态口令和校验

动态口令生成和校验

package mainimport ("crypto/hmac""crypto/sha1""encoding/binary""fmt""time"
)func InArray(check int, origin []int) bool {var exits boolfor _, i := range origin {if i == check {exits = truebreak}}return exits
}// getCode 根据解密的秘钥,获取动态口令码
func GetCode(key string, timeSlice int) string {var code stringtime := make([]byte, 8)binary.BigEndian.PutUint64(time, uint64(timeSlice))h := hmac.New(sha1.New, []byte(key))h.Write(time)hm := h.Sum(nil)fmt.Println()// 计算偏移量offset := hm[len(hm)-1] & 0x0FhashPart := hm[offset : offset+4]// 将哈希值解包为整数value := binary.BigEndian.Uint32(hashPart) & 0x7FFFFFFFmodulo := uint32(1000000)code = fmt.Sprintf("%06d", value%modulo)return code
}// VerifyCode 动态码校验,其实就是生成当前时间戳,前后30秒的动态码,与输入的动态码进行对比;discrepancy:1:前后误差30秒;2:前后误差1分钟
func VerifyCode(secret, code string, discrepancy, currentTimeSlice int) bool {if currentTimeSlice <= 0 {currentTimeSlice = int(time.Now().Unix() / 30)}if discrepancy < 1 {discrepancy = 1}if len(code) != 6 {return false}for i := -discrepancy; i <= discrepancy; i++ {calculatedCode := GetCode(secret, currentTimeSlice+i)if calculatedCode == code {return true}}return false
}// GetQrCode 生成二维码:secret(秘钥) ,accountName(用户名:必填), issuer(系统名称),appKey(聚合数据接口key)
func GetQrCode(secret, accountName, issuer, appKey string) string {// otpauth://totp/Issuer:AccountName?secret=Base32Secret&issuer=IssuerNameurlEncode := url.QueryEscape(fmt.Sprintf("otpauth://totp/%s?secret=%s", accountName, secret))if issuer != "" {urlEncode += url.QueryEscape("&issuer=" + url.QueryEscape(issuer))}return fmt.Sprintf("https://apis.juhe.cn/qrcode/api?key=%s&text=%s&w=200&h=200&el=m&type=2", appKey, urlEncode)
}

三、使用

使用二维码生成,需要申请二维码生成

package mainimport ("fmt""math""time"
)var (secret stringkey    stringtimes  intcode   stringchecked boolappKey string
)func main() {times = int(math.Floor(float64(time.Now().Unix() / 30)))// 生成秘钥secret = google2fa.SourceCreatSecret(101)fmt.Println(GetQrCode(secret, "juhe007", "聚合数据", appKey))// https://apis.juhe.cn/qrcode/api?key=883d38*******a6955df906ca&text=otpauth%3A%2F%2Ftotp%2Fjuhe007%3Fsecret%3D7GAKYUQRJDBZBAPTZO6RV7JHQBDWBBGHLGYDD5EFG3UOOGTWKWQYK5UOBPZCA2IS7B64MME5KBFT2W63ERZ6GJCNN23K67TNWBTWB%26issuer%3D%25E8%2581%259A%25E5%2590%2588%25E6%2595%25B0%25E6%258D%25AE&w=200&h=200&el=m&type=2fmt.Println(secret)// 解密生成的秘钥key = google2fa.SourceDecodeSecret(secret)// 根据秘钥和当前时间片生成动态码code = google2fa.GetCode(key, times)fmt.Println(key)fmt.Println("========================:动态口令验证=202:", code, "==", times, "==")// 校验一分钟(2)误差的动态码checked=google2fa.VerifyCode(key, code, 2, 0)fmt.Println(checked)fmt.Println()}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/19823.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

linux 中mysql查看慢日志

1、到mysql容器&#xff0c;先登录到数据库&#xff0c;查看是否开启 mysql -h 127.0.0.1 -uroot -p SHOW VARIABLES LIKE slow_query_log; 2、如果没有开启&#xff0c;需要先开启 set global slow_query_log ON; 3、查看慢日志文件 SHOW VARIABLES LIKE slow_query_log…

奶龙IP联名异军突起:如何携手品牌营销共创双赢?

在快节奏的互联网消费时代&#xff0c;年轻消费群体对产品和品牌的要求越来越挑剔。因此在品牌年轻化的当下&#xff0c;一方面需要品牌自身形象也要不断追求时代感&#xff0c;另一方面品牌也需要不断引领消费者需求&#xff0c;提升竞争力和产品力。 奶龙作为近年来异军突起…

项目中排查bug的思路案例

bug描述&#xff1a;调用了删除的接口&#xff0c;执行成功了&#xff0c;也删掉了选中的数据&#xff0c;但是不执行删除后的处理操作&#xff0c;会报一个“系统未知错误&#xff0c;请反馈给管理员” 解决&#xff1a; 成功删掉了数据&#xff0c;但删除后的操作没有执行&a…

欧瑞博智能家居掀起风潮 助力新加坡智慧国2.0发展

&#xff08;狮城快讯&#xff09;在新加坡智慧国2.0计划的推动下&#xff0c;智能科技日益融入生活&#xff0c;智慧社区建设成为提升生活品质的关键。智能家居品牌ORVIBO凭借创新的AI技术和优质用户体验&#xff0c;迅速成为本地智能家居的领导者&#xff0c;从别墅、公寓到H…

【AI人脸整合包及教程】FaceFusion 3.0.0:AI人脸技术的新高度

一、引言 在当今数字化时代&#xff0c;AI技术不断发展并渗透到各个领域&#xff0c;其中AI人脸技术尤为引人注目。FaceFusion 3.0.0作为这一领域的代表性工具&#xff0c;正引领着新的潮流。 二、FaceFusion 3.0.0的功能特点 高度精确的人脸效果 FaceFusion 3.0.0利用先进的…

OLED透明屏在零售行业有哪些优势

OLED透明屏在零售行业具有诸多优势&#xff0c;这些优势使得它成为零售行业中一种创新且高效的展示工具。以下是对OLED透明屏在零售行业优势的详细分析&#xff1a; 1. 视觉吸引力与沉浸感 高透明度&#xff1a;OLED透明屏能够实现40%以上的透明度&#xff0c;使得屏幕后的物体…

win10 pip 永久镜像

打开文件夹&#xff0c;找到目录 &#xff1a;C:\Users\xxx\AppData\Roaming // xxx是你的用户名 如果看不到AppData文件夹&#xff0c;可以点击上方的查看 &#xff0c;勾选上隐藏的项目即可 然后再Roaming 目录下创建文件夹 pip 在pip文件夹下面创建 pip.ini 文件&#xf…

计算机毕业设计 | SpringBoot+vue城镇保障性住房管理 公租房系统(附源码+论文)

1&#xff0c;绪论 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理城镇保障性住房管理系统的相关信…

软件测试学习笔记丨Selenium学习笔记:元素定位与操作

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/22510 本文为霍格沃兹测试开发学社的学习经历分享&#xff0c;写出来分享给大家&#xff0c;希望有志同道合的小伙伴可以一起交流技术&#xff0c;一起进步~ 说明&#xff1a;本篇博客基于sel…

任我行协同CRM普及版 CommonDict/Edit SQL注入漏洞复现

0x01 产品简介 任我行协同CRM普及版是由成都市任我行信息技术有限公司开发的一款客户关系管理软件。该软件旨在帮助中小企业简化管理流程,提升客户管理能力,以及优化销售业绩。集成了CRM、OA、HR等多项功能于一体,为企业提供了一个全面的管理平台。该软件通过高度集成的解决…

JVM调优理论

JVM调优 文章目录 JVM调优理论JVM内存结构堆栈方法区&#xff08;逻辑上的划分&#xff0c;不同版本略有区别&#xff09; 类加载过程编译与反编译类加载过程 编译器优化机制字节码如何运行Hotspot的即时编译器分层编译找热点方法Hospot 内置的两类计数器 方法内联逃逸分析 垃圾…

(C语言)数据在内存中的储存

目录 1>.存储的方式 2>.关于用%d来打印char类型数 3>.不同类型能表示的范围 4>.浮点数在内存中的存储 储存方式 E在内存中的存储 E在内存中的取出 1&#xff09;E不全是0和1 2&#xff09;E全为0 3&#xff09;E全为1 整数和浮点数在内存中是以二进制的方…

Tryhackme练习-Wonderland

基本信息 由于tryhackme是在线靶场&#xff0c;所以这里的IP均为对方的内网IP 攻击机器&#xff1a;10.10.242.186 靶机&#xff1a;10.10.173.3 目标&#xff1a;获取2个flagroot权限 具体流程 信息收集 首先我们使用fscan进行端口扫描&#xff0c;fscan -h 10.10.173.…

【设计模式-原型】

**原型模式&#xff08;Prototype Pattern&#xff09;**是一种创建型设计模式&#xff0c;旨在通过复制现有对象的方式来创建新对象&#xff0c;而不是通过实例化类来创建对象。该模式允许对象通过克隆&#xff08;复制&#xff09;来创建新的实例&#xff0c;因此避免了重新创…

配置maven本地仓库的路径及镜像仓库

一、本地仓库路径 找到标签&#xff1a;localRepository&#xff0c;将标签中间的内容换成你要配置的库文件夹路径即可&#xff1a; 二、镜像仓库 找到标签&#xff1a;mirrors,配置如下&#xff1a; 可以将url标签中的路径换成你想配置的路径即可

在一个.NET Core项目中使用RabbitMQ进行即时消息管理

为了在一个.NET Core项目中使用RabbitMQ进行即时消息管理&#xff0c;以下是详细的全程操作指南&#xff0c;包括安装、配置、编写代码和调试使用。 一、安装RabbitMQ 1. 安装Erlang RabbitMQ依赖Erlang&#xff0c;因此需要先安装Erlang。 Windows: 下载并运行Erlang安装…

51c大模型~合集60

我自己的原文哦~ https://blog.51cto.com/whaosoft/12102352 #百舸 当大模型Scaling Law继续&#xff0c;万卡集群算力释放在「百舸」这里找到一条通途 在电影《天下无贼》中&#xff0c;葛优扮演的黎叔有这样一句经典的台词&#xff0c;「二十一世纪什么最贵&#xff1f;人…

Auto-Py-to-Exe:一键生成可执行的EXE文件,助力 Python 项目在Windows上快速部署

Python以其简洁易懂的语法和丰富的库而闻名&#xff0c;但对于想要将Python项目分享给他人或进行独立部署的开发者来说&#xff0c;将代码打包成可执行文件往往是必不可少的一步。而Auto-Py-to-Exe就是一个功能强大的工具&#xff0c;它能帮助你轻松将Python脚本转换成独立的可…

如何巧妙使用AI工具

一、AI的介绍 AI&#xff1a;即人工智能&#xff0c;是计算机科学体系下的一个学科&#xff0c;是指通过计算机系统模拟人类智力的一种技术。 AIGC&#xff1a;AI领域的一个应用分支&#xff0c;专注于利用AI技术自动生成内容&#xff0c;包括文本&#xff0c;代码&#xff0…

C/C++ 优化,strlen 示例

目录 C/C optimization, the strlen examplehttps://hallowed-blinker-3ca.notion.site/C-C-optimization-the-strlen-example-108719425da080338d94c79add2bb372 揭开优化的神秘面纱... 让我们来谈谈 CPU 等等&#xff0c;SIMD 是什么&#xff1f; 为什么 strlen 是一个很…