当前位置: 首页 > 知识库问答 >
问题:

加密JWT令牌

时仰岳
2023-03-14

我们正在使用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不需要任何加密,因为只有经过身份验证的用户才能读取令牌,这意味着,我正在读取自己的内容,而且,实际通信将在安全层上进行。所以实际上还不需要加密令牌,我的要求是令牌不应该是人类可读的

共有1个答案

施华奥
2023-03-14

您的理解是正确的,但您遗漏了JWT的一个重要功能:加密令牌不是JWT的目的。
算法使用的秘密用于对令牌签名,而不是加密令牌,有关详细信息,请参阅RFC 7515。
正如下面的注释中所建议的,还有RFC 7516,Json Web加密(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"))
};
 类似资料:
  • 我正在阅读关于JWT Web令牌作为响应用户的访问令牌的文章。其中一些提到Web令牌应该能够被用户解码。 这是否意味着解密整个web令牌不是一个好的做法?例如,我假设将下面的JWT web令牌返回给用户,在那里可以对这段信息进行解码。 但是,我觉得我不想让用户能够解码他/她的访问令牌,所以我使用另一种加密算法将所有内容加密为另一种形式,如下所示并传回给用户。 所以,当我在服务器中得到这个访问令牌并

  • 我实现了生成jwt令牌的oauth。我的令牌包含用户信息,如果我将其放入jwt.io中,则信息是可见的。有没有什么方法可以加密令牌,使其不被jwt.io解密?

  • 我正在阅读JWT的示例文件夹,我有点不确定验证令牌的工作原理。 这里直接使用“mySigningKey”在中签名 现在,对我来说,未解析就不那么清楚了: 是为了验证客户端返回的令牌字符串的签名是否有效,您是否需要 解码声明(在&MyCustomClaims{}中完成) 使用token.valid验证解码声明的签名部分对“令牌中包含的pub密钥”是否有效。 但这个例子只是解码密钥,通过“魔术”返回的

  • 我正在尝试使用Web API 2提供的OAuth不记名令牌,但我不知道如何解加密它们或获取数据。 我真正想做的是找到或为自己编写一个等效的工具,用于我从Web API获得的令牌 https://developers.google.com/wallet/digital/docs/jwtdecoder 这个Google工具。Google工具允许您粘贴代表JWT令牌的文本字符串,并将其拆分并取消编码其中

  • 我正在使用php saml工具包https://github.com/onelogin/php-saml在web应用程序中实现SSO。身份验证本身可以工作,但当我与拦截代理进行检查时https://portswigger.net/burp/communitydownloadsaml标记以清晰的形式显示(作为xml,带有用户名以及为身份验证传递的所有信息)。在连接器和设置中https://githu

  • 我想用当前的方法加密JWT负载,比如对称或非对称加密方法。我的问题是,如果我使用这些方法,javascript需要在客户端对我的数据执行任何操作?还是加密和验证的所有部分都将在服务器端完成?在本文中,他们说,如果需要加密负载,则必须存储公钥(由于RSA或…)等加密算法的缘故)。为什么?如果我需要加密有效负载,为什么我们需要在jwt令牌中存储公钥(或任何密钥)?有没有办法只在服务器端对称加密有效负载