当前位置:首页 > 科技  > 软件

使用 Golang 实现基于时间的一次性密码 TOTP

来源: 责编: 时间:2024-04-03 17:45:56 460观看
导读什么是一次性密码 OTP ?一次性密码(One Time Password),简称 OTP,是只能使用一次的密码。每次做身份认证时都会生成一个新的密码,在使用一次之后立即失效,不能重复使用。这种密码只能使用一次,因此即使攻击者能够窃取到密码,也

CWR28资讯网——每日最新资讯28at.com

什么是一次性密码 OTP ?

一次性密码(One Time Password),简称 OTP,是只能使用一次的密码。每次做身份认证时都会生成一个新的密码,在使用一次之后立即失效,不能重复使用。这种密码只能使用一次,因此即使攻击者能够窃取到密码,也无法再次使用该密码进行身份认证。CWR28资讯网——每日最新资讯28at.com

一次性密码的优点

  • 安全性高,一次性密码只能使用一次,所以即使攻击者能够截获密码,也无法再次使用该密码进行第二次认证。
  • 易于使用,一次性密码通常是通过短信、电子邮件或专用的身份验证应用程序发送给用户的,通常是4到8位的数字、字母或数字字母组合,用户只需要输入收到的密码并且很方便输入。
  • 无需记忆,与传统的静态密码不同,用户不需要记住一次性密码,降低了用户的认知负担,并减少了因忘记密码而导致的问题。

接下来看一下一次性密码实现的几种方式。CWR28资讯网——每日最新资讯28at.com

基于时间的一次性密码(Time-based One-Time Password,TOTP)

密码的有效性依赖当前的时间,每个密码都有一个固定的有效期,例如30秒或60秒。在这个时间窗口结束后,密码会自动失效,系统会生成一个新的密码。CWR28资讯网——每日最新资讯28at.com

这种方法的优点是不依赖于网络连接,因此即使在没有网络连接的情况下,用户也可以生成密码。这种方法的缺点是对时间的同步要求较高,需要客户端和服务器之间的时间保持精确同步,并且用户必须在指定的时间窗口内输入密码,否则密码就会失效。CWR28资讯网——每日最新资讯28at.com

基于哈希的一次性密码(Hash-based One-Time Password,HOTP)

密码的生成依赖一个密钥和一个计数器。每当用户请求一个新的密码时,计数器就会增加,然后使用哈希函数和密钥生成一个新的密码。这种方法的优点是不依赖时间,因此用户可以在任何时间输入密码。相应的缺点是如果计数器的值在服务器和用户设备之间不同步,就可能导致问题。CWR28资讯网——每日最新资讯28at.com

基于短信的一次性密码(SMS-based One-Time Password,SOTP)

密码需要通过短信发送给用户,当用户需要进行身份认证时,系统会发送一个密码到用户的手机。这种方法的优点是很方便直观,相应的缺点是依赖手机网络,如果用户没有手机信号或者手机被盗,就无法接收密码。此外,这种方法也容易受到短信劫持的攻击。CWR28资讯网——每日最新资讯28at.com

基于电子邮件的一次性密码(Email-based One-Time Password,EOTP)

密码通过电子邮件发送给用户。与基于短信的一次性密码类似,这种方法的优点是很容易理解和使用。相应的缺点是依赖电子邮件,如果用户无法访问自己的电子邮件,就无法接收密码。此外,这种方法也容易受到电子邮件劫持的攻击。CWR28资讯网——每日最新资讯28at.com

理论上来说,一次性密码是最安全的。但目前还没有理想的一次性密码的实现方式,大多数情况下,一次性密码的使用场景还是用于辅助身份认证。CWR28资讯网——每日最新资讯28at.com

因为 TOTP 是标准化的协议并且被广泛采用,所以有很多对应的移动应用或者 web 应用实现,被称为身份验证器应用,例如 Google Authenticator、Microsoft Authenticator 等。Golang 也有很多优秀的三方库可以帮助我们快速实现 TOTP 的服务端实现,其中比较有代表性的是 pquerna/otp 库,接下来就使用这个库来演示一下 TOTP 的服务端实现流程。CWR28资讯网——每日最新资讯28at.com

为用户生成 TOTP Key

用户开启双因子认证时,为用户生成 TOTP Key,用于生成 TOTP 密码。将这个密码保存在数据库或者秘钥管理系统中,生成 key 的关键代码如下:CWR28资讯网——每日最新资讯28at.com

key, err := totp.Generate(totp.GenerateOpts{		Issuer:      "Github",		AccountName: "user@example.com",		Period:      30,		Digits:      otp.DigitsSix,    Algorithm: otp.AlgorithmSHA1,	})

这几个参数的意思如下:CWR28资讯网——每日最新资讯28at.com

  • Issuer 意思是应用名称,例如 Github。
  • AccountName 意思要给哪个用户生成 key。
  • Period 意思是 TOTP 密码的有效时间,也是不同 TOTP 密码的生成时间间隔,一般为 30 秒。
  • Digits 意思是生成的密码长度,一般为 6 位。
  • Algorithm,用于 HMAC 签名的算法,默认是 SHA1。

把密钥和密码生成规则分享给用户

通常是将秘钥和密码规则信息以二维码的形式展示给用户,用户使用身份验证器应用扫描二维码保存相关信息并且生成密码。二维码中的内容格式一般如下:CWR28资讯网——每日最新资讯28at.com

otpauth://totp/Github:user@example.com?algorithm=SHA1&digits=6&issuer=Github&period=30&secret=5RLOAFJOB6LRV7WOKFIMDZ5IESZ7L3JMCWR28资讯网——每日最新资讯28at.com

为用户提供“恢复码” Recovery Codes

生成“恢复码” Recovery Codes (使用随机生成的字符串即可)存储到数据库或者秘钥管理系统中。当用户不能访问自己的 TOTP 设备(例如将 TOTP 应用中的 TOTP 秘钥删除了、将 TOTP 应用卸载了、手机丢失了等)时,就无法登录自己的帐户了。因为这种情况比较常见,所以很多网站都会给用户提供“备份代码”或“恢复代码”,并且每个只能使用一次,可以临时用来代替 TOTP 密码。CWR28资讯网——每日最新资讯28at.com

校验用户输入的 TOTP 密码

用户再次登录后,触发双因子认证,要求用户输入 TOTP 密码,服务端检验这个密码。校验的关键代码如下:CWR28资讯网——每日最新资讯28at.com

// 验证一次性密码isValid := totp.Validate(passcode, key.Secret())

模拟生成密钥、校验密码的代码

package mainimport (	"fmt"	"time"	"github.com/pquerna/otp"	"github.com/pquerna/otp/totp")func main() {	// 生成密钥	key, err := totp.Generate(totp.GenerateOpts{		Issuer:      "Github",		AccountName: "user@example.com",		Period:      30,		Digits:      otp.DigitsSix,		Algorithm:   otp.AlgorithmSHA1,	})	if err != nil {		panic(err)	}	fmt.Println("Secret URL: ", key.URL())	// 模拟生成一个一次性密码	now := time.Now()	passcode, err := totp.GenerateCode(key.Secret(), now)	if err != nil {		panic(err)	}	// 验证一次性密码	valid := totp.Validate(passcode, key.Secret())	if valid {		fmt.Println("Valid passcode!")	} else {		fmt.Println("Invalid passcode!")	}}

本文链接:http://www.28at.com/showinfo-26-81255-0.html使用 Golang 实现基于时间的一次性密码 TOTP

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 聊一聊 NPM 依赖管理的复杂性

下一篇: 为什么有 HTTPS?因为 HTTP 不安全!HTTPS 如何实现安全通信?

标签:
  • 热门焦点
  • 红魔电竞平板评测:大屏幕硬实力

    前言:三年的疫情因为要上网课的原因激活了平板市场,如今网课的时代已经过去,大家的生活都恢复到了正轨,这也就意味着,真正考验平板电脑生存的环境来了。也就是面对着这种残酷的
  • 跑分安卓第一!Redmi K60至尊版8月发布!卢伟冰:目标年度性能之王

    8月5日消息,Redmi K60至尊版将于8月发布,在此前举行的战略发布会上,官方该机将搭载搭载天玑9200+处理器,安兔兔V10跑分超177万分,是目前安卓阵营最高的分数
  • Raft算法:保障分布式系统共识的稳健之道

    1. 什么是Raft算法?Raft 是英文”Reliable、Replicated、Redundant、And Fault-Tolerant”(“可靠、可复制、可冗余、可容错”)的首字母缩写。Raft算法是一种用于在分布式系统
  • 谷歌KDD'23工作:如何提升推荐系统Ranking模型训练稳定性

    谷歌在KDD 2023发表了一篇工作,探索了推荐系统ranking模型的训练稳定性问题,分析了造成训练稳定性存在问题的潜在原因,以及现有的一些提升模型稳定性方法的不足,并提出了一种新
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 花7万退货退款无门:谁在纵容淘宝珠宝商家造假?

    来源:极点商业作者:杨铭在淘宝购买珠宝玉石后,因为保证金不够赔付,店铺关闭,退货退款难、维权无门的比比皆是。“提供相关产品鉴定证书,支持全国复检,可以30天无理由退换货。&
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 2021中国国际消费电子博览会与青岛国际软件融合创新博览会新闻发布会隆重举行

    9月18日,2021中国国际消费电子博览会与青岛国际软件融合创新博览会新闻发布会在青岛国际新闻中心隆重举行。发布会上青岛市政府领导联袂出席,对本次双展会情
Top