【问题标题】:Empty payload when generating JWS生成 JWS 时为空有效负载
【发布时间】:2021-04-20 12:58:51
【问题描述】:

我的目标是创建一个未加密的签名令牌。我正在像这样生成我的 JWT:

private const string C_ISSUER_SIGNINGKEY = "kXp2s5v8y/B?D(G+KbPeShVmYq3t6w9z";
private const JweAlgorithm JWE_ALGO = JweAlgorithm.DIR;
private const JweEncryption JWE_ENCR = JweEncryption.A128CBC_HS256;

public string GenerateToken(Dictionary<string, object> aPayload, TimeSpan aExpirationTime)
{
   var aNowMs = DateTime.Now.ToUniversalTime().Subtract(
                    new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
                    ).TotalMilliseconds;
   if (aExpirationTime.TotalMilliseconds > 0)
   {
       var lExp = aNowMs + aExpirationTime.TotalMilliseconds;
       aPayload.Add("exp", lExp);
   }
   var aSecretKey = Encoding.UTF8.GetBytes(C_ISSUER_SIGNINGKEY);
   var aToken = JWT.Encode(aPayload, aSecretKey, JWE_ALGO, JWE_ENCR);
   return aToken;
}

当使用这个时,我得到一个像这样的令牌:

var lPayLoad = new Dictionary<string, object>()
{
    { "emailAddress", "peter@email.com" },
    { "password", "password" }
};
var lToken = lEncryptor.GenerateToken(lPayLoad, new TimeSpan(50,50,50,50));

然后我会得到这样的令牌:eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0..4lvBJr_Q0X_hj5OL5rdMsA.d0S--Vdm0JDkjYcN1Djnx4KV3DbehzwkHlvDKlFQuAk.DVS5O8zmJr2l1axenk2Fgw

(注意,令牌中的有效负载部分为空)

当我尝试对此进行解码(通过 jwt.Io 或任何其他工具)时,我无法验证签名者,也无法获取有效负载。

我到底做错了什么?

【问题讨论】:

  • 这确实是一个没有有效负载的无效令牌,但目前还不清楚您的目标是什么。您的代码的某些部分看起来像您想要创建一个加密令牌 (JWE),但您最终会得到一个无效的 JWS(签名令牌),它的标头中也有一个无效的 algclaim。
  • @jps。谢谢你的评论。我的目标是制作一个未加密的签名令牌。我的印象是 JWT.Encode 只签名,不加密。我对这个假设有误吗?
  • JWT.Encode 似乎对其进行了签名,这是真的,但我想知道实际使用了哪种算法,因为给定的 JWE_ALGO = JweAlgorithm.DIR; 对于已签名的令牌没有意义。它通常应该是类似的东西。 HS256,或`RS256。您在这里使用哪个库?
  • @jps,就是这样!字符串 tokenSigned = JWT.Encode(aPayload, aSecretKey, JwsAlgorithm.HS256);解决了我的问题。我正在使用何塞,顺便说一句。如果您想将此添加为答案,我会接受。
  • @jps。我正在使用 jose-jwt。

标签: c# encryption jwt jose


【解决方案1】:

在您的代码中,您为签名令牌 (JWS) 使用了错误的算法类型。

JweAlgorithm JWE_ALGO = JweAlgorithm.DIR

var aToken = JWT.Encode(aPayload, aSecretKey, JWE_ALGO, JWE_ENCR);

在这种情况下,JWE_ENCR 参数也是错误的。

对于使用jose-jwt 创建的 JWS,您需要选择适当的签名算法,例如:

 JwsAlgorithm.HS256

 JwsAlgorithm.HS512
 JwsAlgorithm.RS256
 JwsAlgorithm.RS512
 JwsAlgorithm.ES256

等等。 (Reference)

如果将行更改为:

JWT.Encode(aPayload, aSecretKey, JwsAlgorithm.HS256);

它应该可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-13
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多