php jwt rs256 publickey 是一串数字
时间: 2023-11-04 17:50:08 浏览: 36
是的,公钥是一串数字,通常是以 PEM 格式表示的。PEM 格式是一种 Base64 编码的 ASCII 格式,包含了 BEGIN 和 END 标记,以及公钥的具体内容。在 JWT(JSON Web Token)中,RS256 是一种加密算法,使用公钥来验证签名,确保 JWT 的完整性和安全性。通过使用正确的公钥,可以验证 JWT 的真实性,并确认其是否被篡改过。
相关问题
php实现jwt的rs256加密算法
实现JWT的RS256加密算法需要使用PHP的openssl扩展,以下是一个简单的示例代码:
```php
<?php
// 生成JWT Token
function generateToken($payload, $privateKey)
{
// JWT 头部
$header = array(
"alg" => "RS256",
"typ" => "JWT"
);
// JWT 载荷
$payload = json_encode($payload);
// JWT 签名
$headerEncoded = base64UrlEncode(json_encode($header));
$payloadEncoded = base64UrlEncode($payload);
$data = $headerEncoded . '.' . $payloadEncoded;
$signature = '';
openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA256);
$signatureEncoded = base64UrlEncode($signature);
// JWT Token
$jwtToken = $headerEncoded . '.' . $payloadEncoded . '.' . $signatureEncoded;
return $jwtToken;
}
// 验证JWT Token
function verifyToken($jwtToken, $publicKey)
{
$jwtParts = explode('.', $jwtToken);
if (count($jwtParts) != 3) {
return false;
}
$headerEncoded = $jwtParts[0];
$payloadEncoded = $jwtParts[1];
$signatureEncoded = $jwtParts[2];
$header = json_decode(base64UrlDecode($headerEncoded), true);
if (!isset($header['alg']) || $header['alg'] !== 'RS256') {
return false;
}
$payload = json_decode(base64UrlDecode($payloadEncoded), true);
if (!$payload) {
return false;
}
$data = $headerEncoded . '.' . $payloadEncoded;
$signature = base64UrlDecode($signatureEncoded);
// 验证签名
$verifyResult = openssl_verify($data, $signature, $publicKey, OPENSSL_ALGO_SHA256);
if ($verifyResult === 1) {
return true;
} else {
return false;
}
}
// Base64 URL 编码
function base64UrlEncode($data)
{
$urlsafe = strtr(base64_encode($data), '+/', '-_');
return rtrim($urlsafe, '=');
}
// Base64 URL 解码
function base64UrlDecode($data)
{
$data = strtr($data, '-_', '+/');
$dataLen = strlen($data) % 4;
if ($dataLen) {
$data .= str_repeat('=', 4 - $dataLen);
}
return base64_decode($data);
}
// 读取私钥
$privateKey = openssl_pkey_get_private("file://path/to/private_key.pem");
// 读取公钥
$publicKey = openssl_pkey_get_public("file://path/to/public_key.pem");
// 生成Token
$payload = array(
"sub" => "1234567890",
"name" => "John Doe",
"iat" => 1516239022
);
$jwtToken = generateToken($payload, $privateKey);
echo "JWT Token: " . $jwtToken . "\n";
// 验证Token
$verifyResult = verifyToken($jwtToken, $publicKey);
if ($verifyResult) {
echo "Token 验证成功\n";
} else {
echo "Token 验证失败\n";
}
```
在以上示例代码中,`generateToken` 函数用于生成JWT Token,`verifyToken` 函数用于验证JWT Token。`base64UrlEncode` 和 `base64UrlDecode` 分别用于进行Base64 URL编码和解码。请注意,需要将私钥和公钥保存在文件中,并且需要指定正确的文件路径。
php实现jwt中的rs256加密代码
以下是使用 PHP 实现 JWT 中 RS256 算法的示例代码:
```php
<?php
// 生成 JWT Token
function generateToken($payload, $privateKey) {
$header = array('alg' => 'RS256', 'typ' => 'JWT');
$jwt = base64_encode(json_encode($header)) . '.' . base64_encode(json_encode($payload));
openssl_sign($jwt, $signature, $privateKey, 'SHA256');
$jwt .= '.' . base64_encode($signature);
return $jwt;
}
// 验证 JWT Token
function verifyToken($jwt, $publicKey) {
list($headerEncoded, $payloadEncoded, $signatureEncoded) = explode('.', $jwt);
$header = json_decode(base64_decode($headerEncoded), true);
$payload = json_decode(base64_decode($payloadEncoded), true);
$signature = base64_decode($signatureEncoded);
$jwt = $headerEncoded . '.' . $payloadEncoded;
$isVerified = openssl_verify($jwt, $signature, $publicKey, 'SHA256');
return $isVerified ? $payload : null;
}
// 加载密钥
$privateKey = openssl_pkey_get_private(file_get_contents('private.key'));
$publicKey = openssl_pkey_get_public(file_get_contents('public.key'));
// 生成 Token
$payload = array('sub' => '1234567890', 'name' => 'John Doe', 'iat' => 1516239022);
$jwt = generateToken($payload, $privateKey);
echo $jwt . "\n";
// 验证 Token
$verifiedPayload = verifyToken($jwt, $publicKey);
var_dump($verifiedPayload);
?>
```
在以上代码中,`generateToken` 函数用于生成 JWT Token,其中 `$payload` 参数是包含用户信息的数组,`$privateKey` 是使用 `openssl_pkey_get_private` 加载的私钥。`verifyToken` 函数用于验证 JWT Token,其中 `$jwt` 参数是要验证的 Token 字符串,`$publicKey` 是使用 `openssl_pkey_get_public` 加载的公钥。在示例代码中,私钥和公钥保存在文件 `private.key` 和 `public.key` 中。