如何在ASP.NET Core 6中加密JWT载荷?
如何加密JWT的载荷数据
要加密JWT的载荷,得生成JWE(JSON Web Encryption)——这是一种对JWT载荷进行加密的标准格式,区别于普通的签名型JWT(JWS)。下面是适配你现有代码的具体修改步骤:
1. 补充加密密钥配置
先在AuthOptions里新增加密专用密钥(建议和签名密钥分开,降低密钥泄露的风险):
public class AuthOptions { public const string ISSUER = "MyAuthServer"; public const string AUDIENCE = "MyAuthClient"; const string SIGNING_KEY = "mysupersecret_secretsecretsecretkey!123"; const string ENCRYPTION_KEY = "myencryptionkey_strongandlongenough!456"; // 注意:AES-256算法需要32字节密钥,所以字符串长度要足够 public static SymmetricSecurityKey GetSymmetricSecurityKey() => new SymmetricSecurityKey(Encoding.UTF8.GetBytes(SIGNING_KEY)); public static SymmetricSecurityKey GetEncryptionKey() => new SymmetricSecurityKey(Encoding.UTF8.GetBytes(ENCRYPTION_KEY)); }
2. 配置JWT认证的解密密钥
在AddJwtBearer的参数里,给TokenValidationParameters加上TokenDecryptionKey,这样认证时才能解密载荷:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidIssuer = AuthOptions.ISSUER, ValidateAudience = true, ValidAudience = AuthOptions.AUDIENCE, ValidateLifetime = true, IssuerSigningKey = AuthOptions.GetSymmetricSecurityKey(), ValidateIssuerSigningKey = true, TokenDecryptionKey = AuthOptions.GetEncryptionKey() // 新增解密密钥 }; });
3. 修改Token生成逻辑,生成加密的JWE
原来的WriteToken只能生成签名的JWS,要生成加密的JWE,得用JwtSecurityTokenHandler的EncryptToken方法,并且指定加密相关的参数:
app.Map("/login/{username}", (string username) => { var claims = new List<Claim> {new Claim(ClaimTypes.Name, username) }; var jwt = new JwtSecurityToken( issuer: AuthOptions.ISSUER, audience: AuthOptions.AUDIENCE, claims: claims, expires: DateTime.UtcNow.Add(TimeSpan.FromMinutes(2)), signingCredentials: new SigningCredentials(AuthOptions.GetSymmetricSecurityKey(), SecurityAlgorithms.HmacSha256)); // 生成加密的JWE var handler = new JwtSecurityTokenHandler(); var encryptDescriptor = new SecurityTokenDescriptor { Token = jwt, EncryptingCredentials = new EncryptingCredentials( AuthOptions.GetEncryptionKey(), SecurityAlgorithms.Aes256KW, // 密钥包装算法 SecurityAlgorithms.Aes256CbcHmacSha512) // 内容加密算法 }; var encryptedToken = handler.EncryptToken(encryptDescriptor); return encryptedToken; });
注意事项
- 算法选择:示例用的
Aes256KW(密钥包装)和Aes256CbcHmacSha512(内容加密)是常用组合,你也可以换成Aes128GCM等其他符合JWE标准的算法,但要保证前后端一致。 - 密钥安全性:加密密钥和签名密钥都要妥善保管,不要硬编码到代码里(可以用配置文件或密钥管理服务),生产环境建议用随机生成的强密钥。
- JWE格式:加密后的Token是五段式字符串,和普通JWS的三段式不同,这是正常的,认证时JWT中间件会自动处理解密。
内容的提问来源于stack exchange,提问作者xXKoksMenXx
相关产品推荐
相关产品推荐

