PHP 8 中推荐使用 random_bytes() 生成安全随机 Token,配合 bin2hex() 得十六进制字符串(如 32 字节→64 字符),或经 strtr/base64_encode 处理为 URL 安全 Base64 格式,禁用 mt_rand、uniqid 等不安全方法。

PHP 8 中生成安全随机 Token 的推荐方式是使用 random_bytes() 函数,它基于操作系统的加密安全随机数生成器(如 /dev/urandom 或 CryptGenRandom),比旧的 mt_rand() 或 uniqid() 更可靠,适合用于 API 密钥、密码重置令牌、CSRF Token 等场景。
使用 random_bytes() + bin2hex() 生成十六进制 Token
这是最常用、简洁且可读性好的方式,适合大多数 Web 应用需求:
-
生成 32 字节 → 64 位十六进制字符串(推荐长度):
$token = bin2hex(random_bytes(32)); // 如:a1b2c3...(64 字符) -
若需更短 Token(如 16 字节 → 32 位):
$token = bin2hex(random_bytes(16)); // 32 字符,适用于 URL 友好场景 - 注意:
bin2hex()输出全小写十六进制,无需额外处理大小写
生成 Base64 编码 Token(更紧凑,但需 URL 安全处理)
Base64 编码比 hex 更短(约 30%),但原始 base64_encode() 含 +、/ 和 =,不直接适合 URL 或文件名:
-
推荐做法:URL 安全 Base64(去掉特殊字符并省略填充):
$token = rtrim(strtr(base64_encode(random_bytes(32)), '+/', '-_'), '='); - 结果示例:
YzFhMmIzZDQ1ZjY3ZTg5YWEyYzNiZGUxZjJkNTY3ZDg5(43 字符,无特殊符号) - 该格式兼容 JWT、OAuth 等标准,也便于存入数据库或传递在 URL 中
避免不安全的旧方法
以下方式在 PHP 8 中不应再使用,因缺乏密码学安全性或可预测性:
通过 Auth0 Token Vault,代表已认证用户访问 Gmail、Slack、Google Calendar、GitHub 等第三方服务以及自定义 Auth0 连接。使用...
立即学习“PHP免费学习笔记(深入)”;
-
md5(uniqid())或sha1(microtime() . rand())—— 时间和进程 ID 可被推测 -
mt_rand()系列函数 —— Mersenne Twister 不是加密安全伪随机数生成器(CSPRNG) -
openssl_random_pseudo_bytes()—— 已在 PHP 7.4+ 废弃,random_bytes()是其现代替代
封装成可复用函数(带长度与编码选项)
可将逻辑封装为一个灵活的小工具函数:
function generateToken(int $length = 32, string $encoding = 'hex'): string<br>{<br> if ($encoding === 'hex') {<br> return bin2hex(random_bytes($length));<br> } elseif ($encoding === 'base64url') {<br> $bytes = random_bytes($length);<br> return rtrim(strtr(base64_encode($bytes), '+/', '-_'), '=');<br> } else {<br> throw new InvalidArgumentException('Unsupported encoding');<br> }<br>}
调用示例:echo generateToken(24, 'base64url'); // 约 32 字符 URL 安全 Token


















