惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog RSS Feed
云风的 BLOG
云风的 BLOG
爱范儿
爱范儿
WordPress大学
WordPress大学
博客园 - 三生石上(FineUI控件)
阮一峰的网络日志
阮一峰的网络日志
Martin Fowler
Martin Fowler
C
Check Point Blog
MongoDB | Blog
MongoDB | Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
人人都是产品经理
人人都是产品经理
博客园 - Franky
罗磊的独立博客
博客园 - 司徒正美
S
SegmentFault 最新的问题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
V2EX
Last Week in AI
Last Week in AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 聂微东
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
小众软件
小众软件
美团技术团队

zodream梦想开源/个人编程日记

文件解析笔记-zodream梦想开源/个人编程日记 密码本开发笔记之读写与保存-zodream梦想开源/个人编程日记 SkiaSharp 把 pixel byte[] 转成 SKBitmap-zodream梦想开源/个人编程日记 nas 使用 Docker 安装 gogs-zodream梦想开源/个人编程日记 复制 android 手机中的文件到电脑-zodream梦想开源/个人编程日记 周报:寻找优质的周刊-zodream梦想开源/个人编程日记 开发日志:对Markdown的代码块新增引用来源支持-zodream梦想开源/个人编程日记 周报:怎么写技术类的教程文章-zodream梦想开源/个人编程日记 css display:flex 布局尺寸超出问题-zodream梦想开源/个人编程日记 周报:SEO优化的思考-zodream梦想开源/个人编程日记 Edge 浏览器不适用 Edge Image Viewer 打开图片 -zodream梦想开源/个人编程日记 SEO 学习笔记(一) 内容来源-zodream梦想开源/个人编程日记 WPF MVVM 获取List 多选数据-zodream梦想开源/个人编程日记 Burp Suite 抓包-zodream梦想开源/个人编程日记 使用 indexnow 注意事项-zodream梦想开源/个人编程日记 Godot 使用字体图标 例如: Iconfont、FontAwesome-zodream梦想开源/个人编程日记 angular 15 对指定页面进行访问限制-zodream梦想开源/个人编程日记 CSS 使用 column-count 实现瀑布流出现内容分割的解决办法-zodream梦想开源/个人编程日记 input 确认按键事件在手机端不生效-zodream梦想开源/个人编程日记 C# 使用socket 进行通讯-zodream梦想开源/个人编程日记 Maui开发中Windows应用开启管理员权限-zodream梦想开源/个人编程日记 Maui 中自定义控件-zodream梦想开源/个人编程日记 angular 14 使用 ng-template 实现tree 结构显示-zodream梦想开源/个人编程日记 c# 动态安装和卸载dll-zodream梦想开源/个人编程日记 慎用 CompositionTarget.Rendering-zodream梦想开源/个人编程日记 c# 重写 c++ 程序笔记:数据初始化-zodream梦想开源/个人编程日记 源码编译 aseprite-zodream梦想开源/个人编程日记 记录一下字符串分隔split各语言之间的不同-zodream梦想开源/个人编程日记 c# Gzip解码无头内容-zodream梦想开源/个人编程日记 Windows 10 查看内存占用-zodream梦想开源/个人编程日记
PHP 实现双因素身份认证(2FA)-zodream梦想开源/个人编程日记
zodream · 2024-02-27 · via zodream梦想开源/个人编程日记

PHP 实现双因素身份认证(2FA)

双因素身份认证,简单理解就是使用账户密码登录后需要使用一个动态码确认,账户密码动态码 两种方式登录,多一步就多一点安全性,

但是,这种方式也牺牲了方便。因此,有多种形式的动态码确认,常见的就有:基于TOTP验证APP,例如Google Authenticator、微软的 Authenticator;网上银行的U盾,这类第三方专属物理设备验证。

TOTP

今天,需要实现的是基于 TOTP (基于时间的一次性密码)实现的两步验证。

需要实现的步骤如下:

  1. 用户登录后,需要手动启用两步验证,
  2. 生成专有的恢复码和包含密钥的二维码,
  3. 用户使用Authenticator扫码后,需要提供Authenticator生成的动态码进行启用,
  4. 用户重新登录后需要提供动态码才能完成登录操作

代码实现

依赖

TwoFactorAuth

composer require robthree/twofactorauth

1

生成密钥


use RobThree\Auth\TwoFactorAuth;

$provider = new TwoFactorAuth('你的域名');

$secret_key = $provider->createSecret();

$qr = $provider->getQRCodeImageAsDataUri('用户的名称获取ID', $secret_key);

123456789

显示二维码即可,当然要保存 $secret_key 跟用户关联上;

验证动态码

基本原理: 每30秒生成一个动态码

TC = floor(unixtime(now) / 30)

TOTP = HASH(SecretKey, TC)

123

use RobThree\Auth\TwoFactorAuth;

$provider = new TwoFactorAuth('你的域名');

$provider->verifyCode($secret_key, $_POST['code']); // bool

12345

第一步开启2fa

登录强制要求动态码

参考

TwoFactorAuth

转载请保留原文链接: https://zodream.cn/blog/id/249.html