
本文详解如何使用原生 PHP 函数(仅 hash_hmac、json_encode 和自定义 Base64Url 编码)正确生成 HS512 签名的 JWT,重点纠正因二进制签名未正确编码导致的验证失败问题。
本文详解如何使用原生 php 函数(仅 `hash_hmac`、`json_encode` 和自定义 base64url 编码)正确生成 hs512 签名的 jwt,重点纠正因二进制签名未正确编码导致的验证失败问题。
JWT(JSON Web Token)由三部分组成:Header、Payload 和 Signature,以英文句点(.)分隔。生成合法 JWT 的关键在于:Signature 必须是对 base64url(header).base64url(payload) 字符串,使用 HS512 算法与密钥进行 HMAC 计算后的二进制结果,再经 Base64Url 编码所得。
常见错误是调用 hash_hmac(..., false) —— 此时返回的是十六进制字符串(如 "a1b2c3..."),长度为 128 字符(SHA-512 输出 64 字节 → 十六进制表示为 128 字符),而 JWT 规范要求对原始 64 字节二进制摘要进行 Base64Url 编码(输出约 86–88 字符)。jwt.io 验证失败正是因此:它用密钥重新计算 HMAC 并做相同 Base64Url 编码后比对,若你编码的是 hex 字符串,必然不匹配。
✅ 正确做法是传入第四个参数 true,让 hash_hmac() 返回原始二进制数据:
$signature = hash_hmac('sha512', "$header.$payload", $signing_key, true); // ← 二进制摘要
$signature = base64_url_encode($signature); // ← 再编码为 URL 安全 Base64
以下是完整、可直接运行的实现(兼容 PHP 7.4+,无需任何扩展):
function gen_jwt(): string
{
$signing_key = "changeme"; // ⚠️ 生产环境请使用 cryptographically secure secret
// Header: {"alg":"HS512","typ":"JWT"}
$header = json_encode(['alg' => 'HS512', 'typ' => 'JWT'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
$header = base64_url_encode($header);
// Payload: e.g., {"exp":0} (for testing only)
$payload = json_encode(['exp' => 0], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
$payload = base64_url_encode($payload);
// Signature: HMAC-SHA512 in binary mode → Base64Url encoded
$signature = hash_hmac('sha512', "$header.$payload", $signing_key, true);
$signature = base64_url_encode($signature);
return "$header.$payload.$signature";
}
function base64_url_encode(string $data): string
{
return str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($data));
}
? 关键注意事项:
-
hash_hmac(..., true)是核心:必须启用二进制输出,否则签名永远无效; -
base64_url_encode()必须严格替换+→-、/→_、去除末尾=,这是 JWT 规范(RFC 7515)强制要求; - Header 和 Payload 的 JSON 编码应避免多余空格或转义(推荐使用
JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); - 密钥建议使用
random_bytes(64)生成高熵密钥,而非硬编码字符串; - 实际项目中,务必校验
exp、iat等声明,并在服务端验证签名——本例仅聚焦生成逻辑。
运行该函数将输出形如 eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJleHAiOjB9.xxxxx... 的有效 JWT,可在 jwt.io 或任意标准 JWT 验证器中成功校验。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











