动态令牌离线生成机制探究(2FA & TOTP)

本文介绍了动态令牌的离线生成机制,特别是2FA(双重因素认证)中的TOTP(基于时间的一次性口令)。通过阐述OTP的概念,HOTP的计数器原理,以及TOTP将计数器替换为时间戳的改进,展示了如何实现与谷歌身份验证器类似的验证过程。此外,还提供了在线测试资源以便读者实践。
摘要由CSDN通过智能技术生成

前言

也许你用过银行的密码器,以工商银行的网银电子密码器为例,它长这样:

a686c9177f3e67090bf289dc39c79f3df8dc5527

可能你以为它是会联网的,毕竟你只要输入转账页面给的一串数字,然后它就会生成一串六位数的一次性口令,你把它输入到转账页面的验证码中,你的钱就转出去了。

但是,实际上它是不联网的,你将它放入断网的地方它照样能生成一次性口令,这是如何运作的?

2FA

2FA,全称 Two Factor Authentication,中文名叫 双重因素认证,便是里面的核心技术。字面意来理解,双重因素认证,即认证需要用到两重因素。比如,你在银行 ATM 取钱的时候既要你的银行卡,也需要只有你才知道的六位数口令,这便是双重因素认证。

再以我们常见的手机验证码为例,它也是属于 2FA 的一种方式,比如,当你在进行敏感操作时(修改口令),首先你需要知道你的用户名,然后需要下发一条手机验证码到你的手机上,目的是为了验证你对手机的所有权,这也是属于双重因素认证的一种方式。

中国大陆由于实名制的关系,几乎所有网站注册都需要使用手机号,而国内用户也没有使用手机令牌的习惯,因此,国内最常见的 2FA 就是手机验证码。

但如果你注册国外的网站,比如 GitHub,你可以选择使用手机令牌,使用到的技术叫做 TOTP(Time-based One-time Password,中文名:基于时间的一次性口令),简单来说就是,当你将你的账户和验证软件绑定之后,在一定时间内,验证软件会生成一串数字(一般是六位数),你将这串数字输入到目标网站,即可完成认证,以谷歌身份验证器为例,它长这样:

v2-bcae061a350a128074d0b41e4db120c3_720w

你需要使用摄像头扫描网站给你提供的二维码,然后它会自动为你存储相关信息,然后就可以开始为你生成验证码了,这个验证码每 30 秒刷新一次,过时即失效。

OTP

上文提到了 TOTP,但是要想理解 TOTP,首先得明白 OTP(One-Time Password,中文名:一次性口令)。正如字面意,他是只能使用一次的口令。对于 OTP,没有特定的算法,但是要求必须是一次性、不可预测 ,一般为了用户输入方便,会使用四位、六位或八位数字。

常见的应用场景还是手机验证码,另外就是最近刚高考完,以湖南省为例,学校会给学生下发一张小卡片用于修改志愿表。上面有 20 条刮刮乐,每一条都对应一个一次性口令,当你将你填报志愿的账户与该卡片绑定(卡片上会有卡号)时,在你每次要进行志愿保存时,均需要提供一条口令,用一次即失效。本质上这也是 2FA,这次你需要提供的是你的志愿填报网站的账号密码一次性口令

image-20210614114821556

所以,在你被正式录取之前,千万不要泄露这张卡片,否则如果他人已经知道了你的账号密码,你的志愿便可以被他人随意修改。

HOTP

RFC4226

明白了 OTP,接下来还需要理解 HOTP(HMAC-based One-Time Password,中文名:基于哈希消息认证码的一次性口令)。它也属于一次性口令,但是生成这个一次性口令,还另外需要提供一串密钥一个随机数,用于生成口令。

它的英文名中有一个词,叫做 HMAC(Hash-based Message Authentication Code,中文名:基于哈希的消息认证码),这个算法主要是用于验证消息的合法性,与常见的哈希算法的唯一区别是,在计算哈希摘要时,还需要额外提供一串密钥,俗称加盐(salt 或 nonce)。一言蔽之:使用一串只有你自己(或双方)才知道的密钥,可以生成一串独一无二的哈希值。

在 HOTP 的应用中,这串密钥只有客户端和服务端双方才知道,被计算摘要的消息要求双方都能知道并保持相同,一般是一个自增计数器,比如:0, 1, 2, 3, 4。被计算出的一次性口令每使用一次,这个计数器就加一,由于密钥只有双方才知道,故双方都可以计算出一样的一次性口令,而第三方不知道这串密钥的,无法计算出一样的口令。

另外这里有个坑,根据 RFC4226#section-5.1 规定,这个计数器必须为一个 8-byte 的整数,即 Int64,高位字节若不足应填充 0x00,这也是我初期研究该算法一直失败的原因之一。

RFC 规定哈希算法使用 HMAC-SHA1,假设密钥为:K='6shyg3uens2sh5slhey3dmh47skvgq5y'

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值