You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 14:10:08