JWT中的签名是base64编码的吗?

问题描述 投票:0回答:1

我正在学习 JWT,我对 JWT 的理解方式如下(假设我们使用

HS256
签名算法):

// pseudo code
HEADER = Base64Encoded(headerJSON)
PAYLOAD = Base64Encoded(payloadJSON)
SIGNATURE = HMACSHA256(`${HEADER}.${PAYLOAD}`, secret)

最后通过连接以上所有内容生成 JWT 字符串:

JWT = `${HEADER}.${PAYLOAD}.${SIGNATURE}`

所以,

HEADER
PAYLOAD
都是base64编码的,但我不确定签名。我认为我们需要
SIGNATURE
进行 base64 编码,并且包含 HTTP 标头是安全的。

如果是编码的,那么我们需要手动进行吗?或者

HMACSHA256
算法自动返回编码版本?
另一方面,如果它没有被编码,那为什么我们不需要它呢?

jwt base64 hmacsha256
1个回答
0
投票

JWT 由 RFC7519 标准定义,其第 1 节 描述:

[...] JWT 对声明进行编码 作为 JSON 对象传输,用作 JSON Web 签名 (JWS) 结构的有效负载或作为 JSON Web 加密 (JWE) 结构的明文 [...] JWT 始终使用 JWS 紧凑序列化 或 JWE 紧凑序列化

表示。

因此 JWT 可以表示为 JWS 紧凑序列化JWE 紧凑序列化

对于非加密的 JWT 令牌,我们使用 RFC7515 标准定义的 JWS 结构。 JWS Compact Serialization 在其 Section-3.1

中进行了描述

在 JWS 紧凑序列化中,JWS 表示为串联:

BASE64URL(UTF8(JWS Protected Header)) || '.' ||
BASE64URL(JWS Payload) || '.' ||
BASE64URL(JWS Signature)

附录-A.1

中还提供了使用HMACSHA256签名算法的编码示例

[...] 使用此密钥在 JWS 签名输入上运行 HMAC SHA-256 算法会生成此 JWS 签名八位字节序列:

[116, 24, 223, 180, 151, 153, 224, 37, 79, 250, 96, 125, 216, 173, 187, 186, 22, 212, 37, 77, 105, 214, 191, 240, 91, 88, 5, 88, 83, 132, 141, 121]
将此 JWS 签名编码为 BASE64URL(JWS Signature) 给出此值:

dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk

所以

,签名是按照规范进行 Base64 编码的,我们需要在运行签名算法后手动对其进行编码。

© www.soinside.com 2019 - 2024. All rights reserved.