2FA 原理与实现

2025-11-12 18:13:27

登录 Github,输完用户名密码后提示还要输 2FA 的临时验证码。我手机升级到了鸿蒙6.0,之前下载的神锁离线版提示安全芯片有变动,没法再用了,索性自己研究下写个 2FA 生成临时验证码的网页应用。

一、什么是 2FA

以前输入密码就能登录,相当于打开门只要一把钥匙。现在还需要临时验证码,相当于打开同样一扇门同时需要两把钥匙。

这样即便弄丢了密码这个钥匙,对方也是打不开门的,更安全。

二、临时验证码

2.1 获取密钥

以 Github 为例,启用 2FA 时会看到上面这个页面。

如果是类似神锁 App 这种 2FA 认证的第三方应用,基本都会有个扫码功能,扫描上述二维码获得 2FA 的密钥。

如果是类似下图这种 具有 2FA 认证功能的网页应用,点击上图中的 setup key,会出现一个弹窗,直接复制里面的密钥。

2.2 生成临时验证码

总而言之就是获得密钥,把这个密钥丢给第三方应用,在第三方应用点击生成临时验证码时,会根据【密钥 + 当前时间戳】这两个因素生成一个6位长度的临时验证码,这个过程可以认为是一个加密过程。

2.3 验证临时验证码

把这个6位长度的临时验证码丢回给 Github,因为 Github 是有密钥的,会做一个相当于解密的操作,如果解密成功,

生成的验证码只有30秒时效,如果验证失败,重新生成立刻验证即可。

三、代码实现生成临时验证码

npm 有个非常强大的 2FA 库 authenticator,如下短短两行实现 2FA 获取临时验证码功能。

import authenticator from 'authenticator';

const code = authenticator.generateToken('密钥')

返回首页

本文总阅读量  次
皖ICP备17026209号-3
总访问量: 
总访客量: