在 JWT(JSON Web Token)体系中,json.sign
(或 jws.Sign
)和 json.verify
(或 jws.Verify
)其实就是对“头部+载荷”做数字签名和验证的过程,整个流程并不涉及加密,只是保证数据未被篡改和可验证签发者身份。
JWS(JSON Web Signature)
JWT 实际上是一种 JWS:
JWT = Base64UrlEncode(header).Base64UrlEncode(payload).Base64UrlEncode(signature)
没有加密
json.sign
)构造 Header
{
"alg": "HS256", // 或 RS256、ES256 等
"typ": "JWT"
}
构造 Payload
你的业务数据,比如:
{
"sub": "1234567890",
"name": "Merrick",
"iat": 1620000000
}
Base64Url 编码
对 Header 和 Payload 分别做 Base64Url 编码,得到两段字符串:
encodedHeader = base64url(headerJSON)
encodedPayload = base64url(payloadJSON)
生成签名输入
signingInput = encodedHeader + "." + encodedPayload
计算签名
Base64Url 编码签名
signature = base64url( rawSignatureBytes )
拼接成最终 JWT
jwt = encodedHeader + "." + encodedPayload + "." + signature
json.verify
)分割 Token
将收到的 JWT 按 .
拆成三部分:A = encodedHeader
,B = encodedPayload
,C = signature
重建签名输入
signingInput = A + "." + B
Base64Url 解码签名
rawSignature = base64url_decode(C)
计算对比签名
signingInput
做 HMAC-SHA256,比较结果与 rawSignature
是否一致;rawSignature
做 RSA-SHA256 验证,确认是由对应私钥签出的。验证成功后
payload
,同时可检查 exp
、nbf
、iss
等声明;