除 PHP 之外,PHP JWT 未经过验证

问题描述 投票:0回答:1

我正在使用 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 中验证

php jwt decode encode
1个回答
0
投票

因为您是从文件中读取密钥,而不是使用硬编码值进行测试,所以很难看出是否包含额外字符,例如换行符。

如果您使用您认为是密钥的内容手动生成哈希,您将看到不同的签名:

$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=
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.