当前位置:首页 > PHP

php实现TOTP

2026-01-30 03:08:34PHP

TOTP 简介

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

实现步骤

安装依赖库 确保已安装 PHP 的 hash_hmacbase64_decode 函数支持。推荐使用 Base32 编码库处理密钥(如 spomky-labs/base32):

composer require spomky-labs/base32

生成共享密钥 使用 Base32 编码生成一个随机密钥:

php实现TOTP

use Base32\Base32;
$secret = Base32::encode(random_bytes(10)); // 16字符的Base32密钥

计算时间窗口 TOTP 以30秒为一个时间窗口(Unix时间戳除以30取整):

$timestamp = time();
$timeWindow = floor($timestamp / 30);

生成HMAC-SHA1哈希 使用 hash_hmac 生成密钥和时间的哈希:

php实现TOTP

$hash = hash_hmac('sha1', pack('J', $timeWindow), Base32::decode($secret), true);

动态截断(DT) 取哈希最后一个字节的低4位作为偏移量,从该偏移量开始截取4字节:

$offset = ord(substr($hash, -1)) & 0x0F;
$binary = substr($hash, $offset, 4);

生成6位数字密码 将截取的二进制数据转换为无符号整数,取最后6位:

$otp = (unpack('N', $binary)[1] & 0x7FFFFFFF) % 1000000;
$otp = str_pad($otp, 6, '0', STR_PAD_LEFT);

完整代码示例

use Base32\Base32;

function generateTOTP($secret, $timestamp = null) {
    $timestamp = $timestamp ?? time();
    $timeWindow = floor($timestamp / 30);
    $binarySecret = Base32::decode($secret);

    $hash = hash_hmac('sha1', pack('J', $timeWindow), $binarySecret, true);
    $offset = ord(substr($hash, -1)) & 0x0F;
    $binary = substr($hash, $offset, 4);

    $otp = (unpack('N', $binary)[1] & 0x7FFFFFFF) % 1000000;
    return str_pad($otp, 6, '0', STR_PAD_LEFT);
}

// 使用示例
$secret = Base32::encode(random_bytes(10));
$otp = generateTOTP($secret);
echo "TOTP: $otp (Secret: $secret)";

验证注意事项

  • 时间同步:服务器和客户端时间需同步(NTP协议推荐)。
  • 容错窗口:验证时可检查前后1-2个时间窗口的密码以应对时钟偏差。
  • 密钥存储:共享密钥需安全存储(如加密数据库)。

通过上述步骤可实现符合 RFC 6238 标准的 TOTP 生成器。

标签: phpTOTP
分享给朋友:

相关文章

php实现分页

php实现分页

PHP实现分页的基本方法 使用LIMIT和OFFSET进行数据库查询分页。通过计算当前页码和每页显示数量,动态生成SQL语句。 $page = isset($_GET['page']) ? (in…

php实现表单

php实现表单

PHP 表单基础实现 创建一个简单的 PHP 表单需要 HTML 表单结构和 PHP 处理脚本。以下是一个完整的示例: HTML 表单部分 (form.html) <form actio…

php验证码实现

php验证码实现

验证码实现方法 在PHP中实现验证码功能通常涉及生成随机字符串或数字,将其转换为图像,并通过会话(Session)进行验证。以下是几种常见的实现方式: 使用GD库生成图像验证码 GD库是PHP内置…

php 实现登录

php 实现登录

PHP 登录功能实现 使用 PHP 实现登录功能通常需要结合数据库验证和会话管理。以下是一个基本的登录实现流程: 数据库准备 创建用户表存储用户名和密码(建议使用哈希加密): CREATE T…

php 购物车实现

php 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

php 实现购物车

php 实现购物车

PHP 实现购物车功能 购物车功能是电子商务网站的核心部分,可以通过 PHP 和 Session 或数据库来实现。以下是两种常见的实现方式: 使用 Session 存储购物车数据 Sessi…