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

use*_*287 7 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')  
Run Code Online (Sandbox Code Playgroud)

问题 01:

字符串的前两部分似乎总是相同的(base64 编码headerpayload值),但第三部分(signature)不同。

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

我试过的:

我已阅读jwt.io/introduction 中signature部分:

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

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

并签字。

所以,作为一个猜测:

使用算法 andsignature对 base64 编码headerpayload值进行加密的结果是不是在这种情况下是 string ,每次加密都会产生不同的结果,而解码结果总是相同的? HS256secretRESTFULAPIs


问题 02:

除了名为 的对象属性外,不同标记的解码值始终相同iat。那个属性代表什么?

jwt.sign({ user_email: user_email, user_id: user_id, username: username }, 'RESTFULAPIs')  
Run Code Online (Sandbox Code Playgroud)

实际上,在对第二个问题进行了更多研究之后,我发现了这一点:

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

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

e.d*_*dan 6

根据文档

iat除非noTimestamp指定,否则默认情况下生成的 jwts 将包含(发布于)声明 。如果iat插入到有效负载中,则将使用它代替真实时间戳来计算其他内容,例如在 中exp给定时间跨度options.expiresIn

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

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