gpt4 book ai didi

php - 在创建 JWT token 期间了解 RS256 和 SHA256

转载 作者:行者123 更新时间:2023-12-04 10:56:11 25 4
gpt4 key购买 nike

我正在使用 PHP 中的私钥创建 JWT token 。为此,我正在使用 OpenSSL 库。在此之前,我将分享我的代码:

PHP

    $header = [
self::ALG => self::RS256,
self::TYP => self::JWT
];
$payload = [
"iss" => $this->getClientID(),
"iat" => time(),
"exp" => time()+999
];
$header = base64_encode(json_encode($header));
$payload = base64_encode(json_encode($payload));
$token = $header.".".$payload;
$pkey = openssl_pkey_get_private($this->getPrivateKey(), $this->getPassPhrase());
openssl_sign($token, $signature, $pkey, 'sha256'); //no algorithm specifically for rs256
$sign = base64_encode($signature);
return $token.".".$sign;

因此,此 JWT token 将用于我尝试访问的服务器中的身份验证。但是我从外部服务器得到的响应是 Bad Request,我的 JWT token 创建过程中出现了问题。

使用相同的凭据,我尝试在 javascript 中使用库 jsrsasign,然后它给了我正确的响应。

JavaScript

// Header
var oHeader = { alg: 'RS256', typ: 'JWT' };
// Payload
var oPayload = {};
var tNow = rs.KJUR.jws.IntDate.get('now');
var tEnd = tNow + 1000;
oPayload.iss = "playground.pizza";
oPayload.iat = tNow;
oPayload.exp = tEnd;
var sHeader = JSON.stringify(oHeader);
var sPayload = JSON.stringify(oPayload);
var pkey = "my private key" //I replaced all the new line with \n here and had in one line
var prvKey = rs.KEYUTIL.getKey(pkey, "my_pass_phrase");
var sJWT = rs.KJUR.jws.JWS.sign("RS256", sHeader, sPayload, prvKey);
ultraSecureToken = sJWT;

我可以清楚地看到的一个区别是,对于 php 端的 signature generation function,我将 sha256 作为算法传递,而在 JavaScript RS256 中 已通过。

我了解到 sha256 只是一种哈希算法,而 RS256 用于编码,但在我在 php 中找到的所有库中,它们仅在 openssl_sign< 内部传递 sha256/功能。并且 openssl_sign 没有将 RS256 作为算法参数。

所以,首先我哪里出错了。

其次,有没有一种方法可以在 php.ini 中使用 RS256 生成签名?

PS:我正在寻找 php 中的解决方案。

最佳答案

  • KJUR.jws.JWS.sign 的返回值由一个点分隔的三个部分组成。第一部分是 Base64url 编码的 JSON 字符串 sHeader,第二部分是 Base64url 编码的 JSON 字符串 sPayload,第三部分是 Base64url 编码的签名。要签名的数据由前两部分组成,包括分隔两部分的点。 RS256意味着 SHA256 和带有 RSASSA-PKCS1-v1_5 填充的 RSA 用于签名。这也可以很容易地在线验证,例如here , 其中 SHA256withRSA 被选为算法。

  • openssl_sign还使用带有 RSASSA-PKCS1-v1_5 填充的 RSA,因此使用 SHA256 创建相同签名,假设应用相同的 key 和相同的要签名的数据。

  • jsrsasign 使用 Base64 url -编码(RFC4648, sect. 5),而 PHP(或更准确地说是 base64_encode-方法)使用 标准 Base64 编码(RFC4648, sect. 4),这很可能是一个原因的问题。这意味着必须将当前 PHP 代码中的编码更改为 Base64url,例如here .

  • 当然,PHP 代码中的底层 JSON 字符串($header$payload$token)也必须与它们在 JavaScript 代码中的对应部分相同,否则签名将不同。由于 PHP 代码不完整,因此无法检查,这可能是问题的另一个原因。

关于php - 在创建 JWT token 期间了解 RS256 和 SHA256,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59173967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com