加密 JWT 令牌

Posted

技术标签:

【中文标题】加密 JWT 令牌【英文标题】:Encrypt JWT token 【发布时间】:2019-07-25 16:48:06 【问题描述】:

我们正在使用JWT Nuget 创建和验证令牌。这是我们用来创建令牌的代码

private string CreateAccessToken(Dictionary<string, object> payload)
    
        IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
        IJsonSerializer serializer = new JsonNetSerializer();
        IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
        IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);
        var token = encoder.Encode(payload, GetJWTKey());
        return token;
    

我的理解是,这不会加密令牌,因为我能够通过访问 jwt.io 来解析令牌并能够读取内容。我想加密令牌,使其不应该被解析。我在JWT Nuget 中找不到任何可以加密令牌的方法。

那么如何使用JWT Nuget 对令牌进行签名和加密?

编辑:

我了解 JWT 不需要任何加密,因为只有经过身份验证的用户才能读取令牌,这意味着,我正在阅读我自己的内容,而且实际通信将通过安全层进行。所以实际上还没有必要加密令牌,我的要求是令牌不应该是人类可读的

【问题讨论】:

令牌应该被签名而不是加密。令牌包含由签名确认的声明。这些不是秘密包裹。 JWT 解决了一个不同的安全概念。 en.wikipedia.org/wiki/Information_security Jwt 可以加密,但 JWT Nuget 似乎不支持这种行为 【参考方案1】:

您的理解是正确的,但是您缺少 JWT 的一个重要特性:加密令牌不是 JWT 的目的。 该算法使用的密钥用于对令牌进行签名而不是对其进行加密,有关更多信息,请查看RFC 7515。 正如下面的 cmets 中所建议的,还有 RFC 7516,Json Web Encryption (JWE)。 要在 C# 应用程序中使用 JWE,您必须使用 System.IdentityModel.Tokens.Jwt 包,然后是:

var handler = new JwtSecurityTokenHandler();
var tokenDescriptor = new SecurityTokenDescriptor

    Audience = "audience",
    //other property
    EncryptingCredentials = new X509EncryptingCredentials(new X509Certificate2("path/to/public/key"))
;

【讨论】:

是的,我阅读了它,只有经过身份验证的用户才能阅读令牌,这意味着,我正在阅读我自己的内容,而且实际通信将通过安全层进行。所以实际上没有必要加密令牌,我的要求是令牌不应该是人类可读的。 @Gopi 如果你真的需要,你仍然可以加密 JWT 声明(属性)并将它们设置为加密。或者 - JwtSecurityToken 呢? 可以说,在这种特殊情况下,令牌只是被编码了。但 JWT 也可以加密。秘密可以被加密算法(dir、AxxxKw、AxxxGCMKW 等)使用。请阅读tools.ietf.org/html/rfc7516。我现在投反对票,等待答案的更新 对@FlorentMorselli,答案不完整,我指的不是正确的文献

以上是关于加密 JWT 令牌的主要内容,如果未能解决你的问题,请参考以下文章

加密 Nodejs JWT 令牌

如何加密 JWT 安全令牌?

加密 JWT 安全令牌支持的算法

JWT令牌加密和http get中的传输

从 JWT 生成访问令牌

在 jwt 令牌中加密 user_name