jwt 公钥与私钥怎么用
时间: 2023-09-13 07:04:39 浏览: 67
使用 JWT(JSON Web Token)的公钥和私钥,主要涉及生成签名(签发令牌)和验证签名(验证令牌)两个过程。
1. 生成签名(签发令牌):
- 使用私钥对 JWT 的头部和载荷进行数字签名,以确保令牌的完整性和真实性。
- 将签名后的结果添加到 JWT 的头部或载荷中,形成最终的 JWT。
2. 验证签名(验证令牌):
- 获取 JWT 中的头部和载荷,并提取签名部分。
- 使用公钥对头部和载荷进行验证,以确认令牌是由合法的签发者签名的。
- 如果验证成功,则说明令牌是有效的。
在实际应用中,生成签名和验证签名的具体实现细节会根据编程语言和库的不同而有所差异。以下是一个示例,使用 C# 和 System.IdentityModel.Tokens.Jwt 库来生成和验证 JWT 的过程:
```csharp
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using Microsoft.IdentityModel.Tokens;
public class JwtHelper
{
public static string GenerateToken(string privateKey)
{
var securityKey = new SymmetricSecurityKey(Convert.FromBase64String(privateKey));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var tokenHandler = new JwtSecurityTokenHandler();
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[] { new Claim("userId", "123") }),
Expires = DateTime.UtcNow.AddDays(1),
SigningCredentials = credentials
};
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
public static bool ValidateToken(string token, string publicKey)
{
var tokenHandler = new JwtSecurityTokenHandler();
var validationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Convert.FromBase64String(publicKey)),
ValidateIssuer = false, // 可选,如果需要验证签发者,请将其设置为 true,并提供有效的 Issuer
ValidateAudience = false // 可选,如果需要验证受众,请将其设置为 true,并提供有效的 Audience
};
try
{
// 验证令牌
tokenHandler.ValidateToken(token, validationParameters, out _);
return true;
}
catch (Exception)
{
// 令牌验证失败
return false;
}
}
}
```
上述代码中,`GenerateToken` 方法用于生成 JWT,其中传入私钥 `privateKey` 用于生成签名。在 `tokenDescriptor` 中,我们设置了 JWT 的主题(Subject)、过期时间(Expires)等信息,并使用私钥进行签名。
`ValidateToken` 方法用于验证 JWT,其中传入公钥 `publicKey` 用于验证签名。在 `validationParameters` 中,我们设置了验证签名的密钥(IssuerSigningKey)和其他可选的验证参数(如验证签发者和受众)。
请注意,上述示例中使用的是对称加密算法(HMAC),密钥是以 Base64 编码的字符串。如果使用非对称加密算法(如 RSA),则需要使用公钥和私钥对,并且相应的密钥格式和库的使用可能会有所不同。
总之,通过使用 JWT 的公钥和私钥,你可以生成签名并签发令牌,也可以验证令牌的签名的真实性和完整性。具体的实现方法会根据你所使用的编程语言和库而有所差异。