在 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 等声明;