为什么即使使用相同的值创建jwt令牌的签名部分也总是不同?

时间:2019-06-24 08:34:58

标签: node.js jwt

jsonwebtoken,v8.5.0
节点v10.13.0
npm 6.4.1

如果我使用以下方法多次创建令牌:

jwt.sign({ user_email: user_email, user_id: user_id, username: username }, 'RESTFULAPIs')  

问题01:

似乎字符串的前2个部分始终是相同的(base64编码的headerpayload值),但是第三部分(signature)却不同。

当原始值相同时,signature为什么不同?

我尝试过的事情:

我已阅读jwt.io/introductionsignature部分:

  

要创建签名部分,您必须:

     
      
  • 编码头
  •   
  • 编码后的有效载荷
  •   
  • 秘密
  •   
  • 标头中指定的算法
  •   
     

并签名。

所以,作为一个猜测:

signature是使用header算法和payload加密base64编码的HS256secret值的结果,在这种情况下是字符串RESTFULAPIs,每次加密都会产生不同的 result ,而解码结果始终是相同的吗?


问题02:

除了称为iat的对象属性以外,不同令牌的解码值始终相同。该财产代表什么?

{
iat: 1561358034
user_id: "25423537fshsdgA"
user_email: "info@test.com"
username: "bob"
}

{
iat: 1561358156
user_id: "25423537fshsdgA"
user_email: "info@test.com"
username: "bob"
}

实际上,在进一步研究了第二个问题之后,我遇到了这个问题:

  

“ iat”(发布于)声明标识了JWT的时间   发行。此声明可用于确定JWT的年龄。它的   值必须是包含NumericDate值的数字。

来源:https://tools.ietf.org/html/rfc7519#section-4.1.6

1 个答案:

答案 0 :(得分:0)

根据docs

  

默认情况下,生成的jwts将包括iat(在处发出)声明,除非   指定了noTimestamp。如果将iat插入有效负载中,它将   用于代替实时时间戳来计算其他内容   例如expoptions.expiresIn中有一个时间跨度。

因此,您可以测试在同一秒内生成多个jwt(因此将具有相同的iat)并验证签名是否相同。或者,使用noTimestamp选项,该选项将消除iat并因此使有效载荷相同。我认为这不是推荐的方法。

但是简而言之,iat是在您回答自己时“发出”的,并且随着插入的iat的变化,有效负载(因此签名)将每秒变化一次我为您引用的文档。