我正在使用 PHP firebase JWT 在我的 PHP 应用程序中实现 JWT。这是我的代码
$payload = [
'iss' => 'http://test.com',
'aud' => 'http://test.com',
'iat' => time(), // Issued at
'exp' => time() + 3600, // Expiration (1 hour)
'data' => [
'user_id' => $user['id'],
'email' => $user['email'],
'role' => $user['role'],
'is_admin' => $user['isadmin']
]
];
$jwt = JWT::encode($payload, $key, 'HS256', $key_file);
编码后生成令牌
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6Ii92YXIvd3d3L215a2V5LmtleSJ9.eyJpc3MiOiJodHRwOi8vdGVzdC5jb20iLCJhdWQiOiJodHRwOi8vdGVzdC5jb20iLCJpYXQiOjE3MjM5NzQ5OTMsImV4cCI6MTcyMzk3ODU5MywiZGF0YSI6eyJ1c2VyX2lkIjoxLCJlbWFpbCI6ImFiYyIsInJvbGUiOiJ1c2VyIiwiaXNfYWRtaW4iOjB9fQ.uC13pivSZGnPr6i8zmPCfEFMsykWR5miIK8t0-DCnug
这很好
密钥文件的内容是
hellohellohellohellohellohellohe
我使用网站 https://jwt.io/ 来测试我的代币和其他几个网站 https://dinochiesa.github.io/jwt/
现在我希望普通用户通过更改密钥kid参数并使用互联网上的任何网站来通过任何网站生成令牌,以便可以在该网站上使用它(演示漏洞)。
我面临两个问题;如果我尝试在任何具有密钥文件的网站上使用上述密钥验证令牌,它会说它无法匹配或验证;有什么问题吗?基于 PHP Firebase 的 JWT 的工作方式是否有所不同? 我也检查了这个 JWT 签名未在 PHP 中验证
因为您是从文件中读取密钥,而不是使用硬编码值进行测试,所以很难看出是否包含额外字符,例如换行符。
如果您使用您认为是密钥的内容手动生成哈希,您将看到不同的签名:
$msg = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6Ii92YXIvd3d3L215a2V5LmtleSJ9.eyJpc3MiOiJodHRwOi8vdGVzdC5jb20iLCJhdWQiOiJodHRwOi8vdGVzdC5jb20iLCJpYXQiOjE3MjM5NzQ5OTMsImV4cCI6MTcyMzk3ODU5MywiZGF0YSI6eyJ1c2VyX2lkIjoxLCJlbWFpbCI6ImFiYyIsInJvbGUiOiJ1c2VyIiwiaXNfYWRtaW4iOjB9fQ';
$key = 'hellohellohellohellohellohellohe';
$algorithm = 'SHA256';
$signature = hash_hmac($algorithm, $msg, $key, true);
echo base64_encode($signature);
#=> zBeba1d7bk/OhMeo5P/Aw1aO2v4JxW+8QXGJsCx1AWI=
但是,如果您在末尾添加一个换行符,您将在示例 JWT 中看到签名(除了稍微不同的 BASE64 编码变体,即“-”与“/”):
$msg = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6Ii92YXIvd3d3L215a2V5LmtleSJ9.eyJpc3MiOiJodHRwOi8vdGVzdC5jb20iLCJhdWQiOiJodHRwOi8vdGVzdC5jb20iLCJpYXQiOjE3MjM5NzQ5OTMsImV4cCI6MTcyMzk3ODU5MywiZGF0YSI6eyJ1c2VyX2lkIjoxLCJlbWFpbCI6ImFiYyIsInJvbGUiOiJ1c2VyIiwiaXNfYWRtaW4iOjB9fQ';
$key = "hellohellohellohellohellohellohe\n";
$algorithm = 'SHA256';
$signature = hash_hmac($algorithm, $msg, $key, true);
echo base64_encode($signature);
#=> uC13pivSZGnPr6i8zmPCfEFMsykWR5miIK8t0+DCnug=