【问题标题】:Encrypt JWT token加密 JWT 令牌
【发布时间】: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 似乎不支持这种行为

标签: c# asp.net-web-api encryption jwt


【解决方案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,答案不完整,我指的不是正确的文献
猜你喜欢
  • 2020-07-15
  • 2018-11-25
  • 2013-08-15
  • 2017-06-11
  • 2023-01-14
  • 2019-07-30
  • 1970-01-01
  • 2014-06-16
  • 2019-04-28
相关资源
最近更新 更多