如何解密并验证含二进制载荷的嵌套JWT
1. 验证签名并提取二进制载荷
解密得到的parsed是签名后的JWT对象,无需解析JSON声明,直接按以下步骤操作:
// 先验证签名,确保数据完整性 verifiedToken, err := parsed.Verify(verificationKey) if err != nil { return err } // 获取原始Base64URL编码的载荷字符串 rawBase64Payload := verifiedToken.RawPayload // 解码Base64URL格式的载荷,得到二进制字节数组 binaryPayload, err := base64.RawURLEncoding.DecodeString(rawBase64Payload) if err != nil { return err } // 此时binaryPayload就是目标二进制数据,比如示例中的{1,2,3,4,5}
2. 核心说明
RawPayload直接返回JWT结构中第二部分的原始编码内容,完全适配二进制载荷场景,不需要强制解析为JSON声明。- 必须先执行签名验证:只有通过
Verify确认签名有效后,提取的载荷才是可信的,避免使用未验证的篡改数据。
示例验证
针对你提供的解密后JWT:
eyJhbGciOiJSUzI1NiIsImtpZCI6ImtleV8wMDIifQ.AQIDBAU.pd5XWuvqkrinyjr2Fm2sgxkG2uxI5pjNRgFVTeYK_881uk1dVZMlWJqkNuzKs053EmIxDB4QpoQ4JwHeKtjShD_Lxyw8hbTbAlezFlsEoWgPKMzpoombEoQW0SxpCJW0PCvqqd6Y7N5m6B_XwP6kPT72MoWKyaVPe1j7O6-Kv1gdyOSmQbWbnzuMzGWp2jnur_8qdIm4gUoNBZeWmG0kbEvLJuIs0qkR-3JSB8ZBQ7S8G4Zw--BtupqhVaF_ZQz7UQhSBMo86rYJiUI3fgDg-dsnB3C8lE7jWshgHRzUCNDA43yiKJQ4as3oa8nBG-F4dpo3ZO5u7grb5hcpkuXYi6dy0F4uFZNKIH3_3yWaoRArvpMIABhyYL1vuEKjNB32p2z3ztmYO5ZDXEI5mSKazd4Lz8WSW5TtUsx2O5WtczSyzJugvbAzShBJxdwS_JzKtOpUOU61fMWrVBqeTIlSp3kJ0AKmsE2GWJ92c8cElW5jWBFnJ64HPi5YS7e1IUgC
调用verifiedToken.RawPayload会得到AQIDBAU,解码后正好是字节数组{1,2,3,4,5},和你的预期一致。
内容的提问来源于stack exchange,提问作者PPGoodMan

