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

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

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

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

什么是一次性密码 OTP ?

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

一次性密码的优点

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

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

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

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

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

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

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

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

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

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

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

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

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

为用户生成 TOTP Key

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

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

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

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

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

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

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

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

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

校验用户输入的 TOTP 密码

用户再次登录后,触发双因子认证,要求用户输入 TOTP 密码,服务端检验这个密码。校验的关键代码如下:QvW28资讯网——每日最新资讯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 如何实现安全通信?

标签:
  • 热门焦点
  • 容量越大越不坏?24万块硬盘故障率报告公布 这些产品零故障

    8月5日消息,云存储服务商Backblaze发布了最新的硬盘故障率报告,年故障率有所上升。Backblaze发布的硬盘季度统计数据,其中包括故障率等重要方面。这些结
  • 分享六款相见恨晚的PPT模版网站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS网站旨在为全球Office用户提供丰富的高品质原创PPT模板、实用文档、数据图表及个性化定制服务。优点:OfficePLUS是微软官方网站,囊括PPT模板、Word模
  • 三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • 这款新兴工具平台,让你的电脑效率翻倍

    随着信息技术的发展,我们获取信息的渠道越来越多,但是处理信息的效率却成为一个瓶颈。于是各种工具应运而生,都在争相解决我们的工作效率问题。今天我要给大家介绍一款效率
  • 零售大模型“干中学”,攀爬数字化珠峰

    文/侯煜编辑/cc来源/华尔街科技眼对于绝大多数登山爱好者而言,攀爬珠穆朗玛峰可谓终极目标。攀登珠峰的商业路线有两条,一是尼泊尔境内的南坡路线,一是中国境内的北坡路线。相
  • 当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己“当家”的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • iQOO 11S评测:行业唯一的200W标准版旗舰

    【Techweb评测】去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,该机不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞
  • 2022爆款:ROG魔霸6 冰川散热系统持续护航

    喜逢开学季,各大商家开始推出自己的新产品,进行打折促销活动。对于忠实的端游爱好者来说,能够拥有一款梦寐以求的笔记本电脑是一件十分开心的事。但是现在的
  • 世界人工智能大会国际日开幕式活动在世博展览馆开启

    30日上午,世界人工智能大会国际日开幕式活动在世博展览馆开启,聚集国际城市代表、重量级院士专家、国际创新企业代表,共同打造人工智能交流平台。上海市副市
Top