当前位置:首页 > PHP

php实现TOTP

2026-03-12 23:44:26PHP

TOTP 简介

TOTP(Time-based One-Time Password)是一种基于时间的一次性密码算法,常用于双因素认证(2FA)。其核心是结合密钥和当前时间戳生成动态验证码,通常每30秒更新一次。

PHP 实现步骤

依赖安装 确保服务器已安装 PHP 且版本 ≥ 7.1。需通过 Composer 安装 sonata-project/google-authenticator 库:

composer require sonata-project/google-authenticator

生成密钥 使用库生成随机密钥,并转换为 Base32 格式便于用户扫描二维码:

use Sonata\GoogleAuthenticator\GoogleAuthenticator;
$g = new GoogleAuthenticator();
$secret = $g->generateSecret();

生成验证码 基于当前时间戳计算验证码(默认30秒有效):

$code = $g->getCode($secret);

验证用户输入 校验用户提供的验证码是否匹配当前或临近时间段的预期值:

$isValid = $g->checkCode($secret, $userInput);

生成二维码 URL 方便移动端扫描绑定(如 Google Authenticator):

php实现TOTP

$qrUrl = $g->getUrl('YourAppName', 'user@example.com', $secret);
// 输出为:otpauth://totp/YourAppName:user@example.com?secret=XXX&issuer=YourAppName

完整示例代码

require_once 'vendor/autoload.php';

$g = new \Sonata\GoogleAuthenticator\GoogleAuthenticator();
$secret = $g->generateSecret();
$qrUrl = $g->getUrl('MyApp', 'user123', $secret);

// 模拟用户输入
$userCode = '123456'; // 从表单获取
$isValid = $g->checkCode($secret, $userCode);

echo "Secret: $secret\n";
echo "QR URL: $qrUrl\n";
echo "Valid: " . ($isValid ? 'Yes' : 'No') . "\n";

注意事项

  • 时间同步:服务器与客户端需保持时间同步,NTP 服务推荐。
  • 密钥存储:密钥需安全存储(如数据库加密字段),不可明文传输。
  • 容错窗口:可通过 $g->setCodeLength(6) 调整验证码位数(默认6位)。

扩展优化

  • 自定义有效期:修改 GoogleAuthenticator 类的 $timeSlice 属性。
  • 多设备支持:同一密钥可在多个设备使用,但需注意同步问题。
  • 备份代码:生成一组静态备用码供紧急情况使用。

标签: phpTOTP
分享给朋友:

相关文章

php实现树

php实现树

PHP实现树结构的方法 在PHP中实现树结构通常可以通过递归或迭代的方式完成。以下是几种常见的实现方法: 递归实现树结构 递归是处理树结构的自然方式,尤其适用于具有未知深度的树。 class Tr…

php实现图片上传

php实现图片上传

实现图片上传的基本步骤 创建HTML表单用于文件上传,表单需设置enctype="multipart/form-data"属性,确保文件数据正确传输。 <form action="upload…

php如何实现直播

php如何实现直播

实现直播功能的方法 PHP可以通过结合其他技术和工具来实现直播功能。以下是几种常见的方法: 使用流媒体服务器 配置流媒体服务器如Nginx-RTMP、Red5或Wowza。这些服务器支持RTMP协…

php实现登录

php实现登录

PHP 登录功能实现 数据库连接与用户表创建 创建一个数据库连接文件 db.php,用于管理数据库连接。MySQL 示例代码如下: <?php $host = 'localhost'; $db…

php实现跳转

php实现跳转

PHP 实现页面跳转的方法 在 PHP 中实现页面跳转有多种方式,以下是常见的几种方法及其适用场景: 使用 header() 函数 通过 header() 函数发送 HTTP 头部信息实现跳转。注意…

php怎么实现登录功能

php怎么实现登录功能

数据库准备 创建用户表存储登录信息,通常包括用户名、密码(需加密)等字段。示例SQL: CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY…