c++如何解析和生成JWT数据格式【进阶】

风杰酱_1106

风杰酱_1106

2026-04-11

530人浏览

原创

jwt解析失败报“invalid base64”需先做url-safe base64预处理:还原'-'→'+'、'_'→'/',再按长度模4补足'='(余2补'==',余3补'='),之后再用openssl解码。

c++如何解析和生成jwt数据格式【进阶】

JWT 解析失败时 openssl 报错 “invalid base64” 怎么办

JWT 的三段式结构(header.payload.signature)都经过 URL-safe Base64 编码,但标准 Base64 解码库(如 OpenSSL 的 EVP_DecodeBlock)不支持去掉填充符 =、且把 +// 替换为 -/_ 的变体。直接传入原始 JWT 字符串会触发 “invalid base64” 或解码后长度异常。

必须先做 URL-safe Base64 预处理:补全填充、还原字符。常见错误是只替换字符却忽略填充——JWT 的每段长度模 4 可能为 0、2、3,需按规则补 =:

  • 长度 % 4 == 0 → 不补
  • 长度 % 4 == 2 → 补 ==
  • 长度 % 4 == 3 → 补 =

示例(C++17,用 std::string 处理):

std::string url_safe_b64_decode(const std::string& s) {
    std::string raw = s;
    // 还原字符
    std::replace(raw.begin(), raw.end(), '-', '+');
    std::replace(raw.begin(), raw.end(), '_', '/');
    // 补填充
    switch (raw.length() % 4) {
        case 0: break;
        case 2: raw += "=="; break;
        case 3: raw += "="; break;
    }
    // 此时可用 OpenSSL 或 boost::beast::http::base64_decode
    return raw;
}

用 openssl 验证 JWT signature 为什么总失败

签名验证不是简单比对哈希值,而是要完整复现 JWT 签名生成逻辑:拼接 base64url(header).base64url(payload)(不含点号),再用对应算法(如 HS256)对这个字符串做 HMAC-SHA256,最后与 JWT 第三段的 base64url 解码结果比对。

容易出错的点:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 拼接时漏掉 . 分隔符?不,验证时绝对不能加点号 —— RFC 7515 明确要求签名输入是 ASCII(base64url(header)) || '.' || ASCII(base64url(payload)),但实际计算时是两段字节流拼接,中间没有 . 字符;
  • 密钥类型混淆:HS256 用原始字节密钥,RS256 必须用 PEM 格式私钥 + 公钥验签,不能把 RSA 私钥当字符串喂给 HMAC;
  • OpenSSL 中 HMAC_CTX 已废弃,C++ 项目应优先用 HMAC 函数族(如 HMAC(EVP_sha256(), key, key_len, input, input_len, out, &out_len)),且注意 input 是拼好的二进制数据,不是 base64 字符串。

如何安全地解析 JWT payload 并提取 exp 字段防止越权

JWT 的 payload 是 JSON,但绝不能用通用 JSON 库(如 nlohmann/json)直接解析未校验 signature 的内容——攻击者可篡改 exp、iat、role 等字段绕过检查。必须坚持「先验签,再解析」流程。

验签通过后解析 payload 仍需防御性处理:

  • exp 和 iat 字段必须是 numeric date(JSON number),不能是字符串;
  • 必须用 std::chrono::system_clock::now().time_since_epoch().count() / 1000000000 获取当前 Unix 时间戳(秒级),与 exp 比较,避免时区或精度偏差;
  • 建议用 json::get<int64_t>()</int64_t> 强制转整型,捕获 json::type_error;若字段缺失,视为无效 JWT。

关键逻辑顺序不可逆:split_jwt → decode_header → verify_signature → decode_payload → check_exp/iat/nbf。

C++ 里该选哪个 JWT 库而不是重复造轮子

除非有极端约束(如裸金属、无第三方依赖),否则不建议手写全部逻辑。目前较稳妥的选择只有两个:

  • cpp-jwt(GitHub: Thalhammer/cpp-jwt):头文件为主,依赖 OpenSSL 和 json.hpp,支持 HS/RS/ES 算法,API 清晰,但不自动处理时钟偏移(需自行加 leeway);
  • jwt-cpp(GitHub: Thalhammer/jwt-cpp):注意这不是 cpp-jwt 的分支,是独立项目,同样基于 OpenSSL,但更活跃,提供 validate 类封装时间窗口和 audience 检查,推荐用于新项目。

避坑提示:别用已归档的 jwtpp 或仅支持 C++11 且无维护的轻量库——它们对 JWK、key rotation、ECDSA 支持极弱,线上环境容易因算法协商失败而崩溃。

最易被忽略的是:所有 C++ JWT 库都**不内置 HTTP 请求能力**,token 从 Authorization header 提取、刷新逻辑、storage(如内存 cache 或 Redis 同步)全得自己实现。这部分往往比解析本身更复杂。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2115

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3222

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1076

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

3659

7

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

6259

3

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.20

3088

5

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

2023.09.14

13626

6

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.14

1625

5

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

2023.12.21

3717

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习