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

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

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

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

什么是一次性密码 OTP ?

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

一次性密码的优点

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

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

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

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

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

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

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

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

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

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

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

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

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

为用户生成 TOTP Key

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

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

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

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

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

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

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

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

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

校验用户输入的 TOTP 密码

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

标签:
  • 热门焦点
  • 7月安卓手机好评榜:三星S23Ultra好评率第一

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年7月1日至7月31日,仅限国内市场。第一名:三星Galaxy S23 Ultra好评率:95.71%在即将迎来新
  • 7月安卓手机性价比榜:努比亚+红魔两款新机入榜

    7月登场的新机有努比亚Z50S Pro和红魔8S Pro,除了三星之外目前唯二的两款搭载超频版骁龙8Gen2处理器的产品,而且努比亚和红魔也一贯有着不错的性价比,所以在本次的性价比榜单
  • 7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月份的手机市场风平浪静,除了红魔和努比亚带来了两款搭载骁龙8Gen2领先版处理器的新机之外,别的也想不到有什么新品了,这也正常,通常6月7月都是手机厂商修整的时间,进入8月份之
  • 消息称迪士尼要拍真人版《魔发奇缘》:女主可能也找黑人演员

    8月5日消息,迪士尼确实有点忙,忙着将不少动画改成真人版,继《美人鱼》后,真人版《白雪公主》、《魔发奇缘》也在路上了。据外媒消息称,迪士尼将打造真人版
  • 如何使用JavaScript创建一只图像放大镜?

    译者 | 布加迪审校 | 重楼如果您曾经浏览过购物网站,可能遇到过图像放大功能。它可以让您放大图像的特定区域,以便浏览。结合这个小小的重要功能可以大大改善您网站的用户体验
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的“网红”。7月5日至9日,为期5天的东方甄选“甘肃行”首次在自有App内直播,
  • 联想YOGA 16s 2022笔记本将要推出,屏幕支持触控功能

    联想此前宣布,将于11月2日19:30召开联想秋季轻薄新品发布会,推出联想 YOGA 16s 2022 笔记本等新品。官方称,YOGA 16s 2022 笔记本将搭载 16 英寸屏幕,并且是一
Top