编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

两步认证简介(2FA)

wxchong 2024-12-05 17:11:32 开源技术 115 ℃ 0 评论

目前很多网站、服务都已经启用了双因素认证。双因素认证又称之为两步认证。就是在你输入自己的用户名、密码之后,还需要在额外的输入一个认证码。这个认证码是动态变化的,只有你自己能够获取,别人是无从知晓的。这样,即使你的密码泄露了,别人也没办法登录。

和使用短信验证码相比,它的好处是不需要发送短信,节省了费用。

比较常用的双因素认证是TOTP(Time-based One-time Password),即基于时间的一次性密码。

通过以下步骤实现:

  1. 用户启用两步认证之后,服务器生成一个密钥
  2. 服务器提示用户扫描二维码(用户手机上事先安装好相应的APP,通常使用google authenticator),通过扫码的方式将密钥保存到用户的手机。这样用户和服务器都拥有了同一个秘钥
  3. 用户在登录时,查看手机APP,APP会根据秘钥和当前的时间生成一个认证码(通常是一个6位数的数字),默认有效期是30秒。在有效期内,将这个认证码提交给服务器端
  4. 服务器同样根据秘钥和当前时间戳生成一个认证码,然后和用户提交的认证码比对。如果不一致,则拒绝登录

秘钥生成原理(基于时间)

1、时间戳,精确到微秒,除以1000,除以30(动态6位数字每30秒变化一次)

2、对时间戳余数 hmac_sha1 编码

3、然后 base32 encode 标准编码

4、输出大写字符串,即秘钥

动态6位数字验证:

Google Authenticator会基于密钥和时间计算一个HMAC-SHA1的hash值,这个hash是160 bit的,然后将这个hash值随机取连续的4个字节生成32位整数,最后将整数取31位,再取模得到一个的整数。

这个就是Google Authenticator显示的数字。

在服务器端验证的时候,同样的方法来计算出数字,然后比较计算出来的结果和用户输入的是否一致。

后继会给出一个golang的实现。


本文参考:

https://my.oschina.net/qiongtaoli/blog/3049118

https://segmentfault.com/a/1190000021582726

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表