首页/新闻资讯/正文详情

C++实现web token加密生成验证

发布时间:2026/11/2 14:56:12 来源:云帆数科 栏目:资讯中心
C++实现web token加密生成验证
代码#include jwt-cpp/traits/boost-json/traits.h #include boost/json/src.hpp // You may require this if you are not building it elsewhere #include iostream #include sstream void testToken() { using sec std::chrono::seconds; using min std::chrono::minutes; using traits jwt::traits::boost_json; using claim jwt::basic_claimtraits; traits::value_type raw_value; traits::parse(raw_value, R##({api:{array:[1,2,3],null:null}})##); claim from_raw_json(raw_value); claim::set_t list{ once, twice }; std::vectorint64_t big_numbers{ 727663072ULL, 770979831ULL, 427239169ULL, 525936436ULL }; const auto time jwt::date::clock::now(); const auto token jwt::createtraits() .set_type(JWT) .set_issuer(auth.mydomain.io) .set_audience(mydomain.io) .set_issued_at(time) .set_not_before(time) .set_expires_at(time min{ 2 } sec{ 15 }) .set_payload_claim(boolean, true) .set_payload_claim(integer, 12345) .set_payload_claim(precision, 12.3456789) .set_payload_claim(strings, claim(list)) .set_payload_claim(array, claim{ big_numbers.begin(), big_numbers.end() }) .set_payload_claim(object, from_raw_json) .sign(jwt::algorithm::none{}); const auto decoded jwt::decodetraits(token); for (auto e : decoded.get_header_json()) std::cout e.key() e.value() std::endl; const auto array traits::as_array(decoded.get_payload_claim(object).to_json().as_object()[api].as_object()[array]); std::cout payload /object/api/array array std::endl; jwt::verifytraits() .allow_algorithm(jwt::algorithm::none{}) .with_issuer(auth.mydomain.io) .with_audience(mydomain.io) .with_claim(object, from_raw_json) .verify(decoded); } void testTokenES256k() { using sec std::chrono::seconds; using min std::chrono::minutes; using traits jwt::traits::boost_json; using claim jwt::basic_claimtraits; // openssl ecparam -name secp256k1 -genkey -noout -out ec-secp256k1-priv-key.pem std::string es256k_priv_key R(-----BEGIN EC PRIVATE KEY----- MHQCAQEEIArnQWnspKtjiVuZuzuZ/l1Uqqq8gb2unLJ/6U/Saf4ioAcGBSuBBAAK oUQDQgAEfy03KCKUpIPMIJBtIG4xOwGm0Np/yHKaK9EDZi0mZ7VUeeNKq476CU5X 940yusahgneePQrDMF2nWFEtBCOiXQ -----END EC PRIVATE KEY-----); // openssl ec -in ec-secp256k1-priv-key.pem -pubout ec-secp256k1-pub-key.pem std::string es256k_pub_key R(-----BEGIN PUBLIC KEY----- MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEfy03KCKUpIPMIJBtIG4xOwGm0Np/yHKa K9EDZi0mZ7VUeeNKq476CU5X940yusahgneePQrDMF2nWFEtBCOiXQ -----END PUBLIC KEY-----); traits::value_type raw_value; traits::parse(raw_value, R##({api:{array:[1,2,3],null:null}})##); claim from_raw_json(raw_value); claim::set_t list{ once, twice }; std::vectorint64_t big_numbers{ 727663072ULL, 770979831ULL, 427239169ULL, 525936436ULL }; const auto time jwt::date::clock::now(); const auto token jwt::createtraits() .set_type(JWT) .set_id(rsa-create-example) .set_issuer(auth.mydomain.io) .set_audience(mydomain.io) .set_issued_at(time) .set_not_before(time) .set_expires_at(time min{ 2 } sec{ 15 }) .set_payload_claim(boolean, true) .set_payload_claim(integer, 12345) .set_payload_claim(precision, 12.3456789) .set_payload_claim(strings, claim(list)) .set_payload_claim(array, claim{ big_numbers.begin(), big_numbers.end() }) .set_payload_claim(object, from_raw_json) .sign(jwt::algorithm::es256k(es256k_pub_key, es256k_priv_key, , )); const auto decoded jwt::decodetraits(token); for (auto e : decoded.get_header_json()) std::cout e.key() e.value() std::endl; const auto array traits::as_array(decoded.get_payload_claim(object).to_json().as_object()[api].as_object()[array]); std::cout payload /object/api/array array std::endl; jwt::verifytraits() .allow_algorithm(jwt::algorithm::es256k(es256k_pub_key, es256k_priv_key, , )) .with_issuer(auth.mydomain.io) .with_audience(mydomain.io) .with_claim(object, from_raw_json) .verify(decoded); } void testTokenRS256() { using sec std::chrono::seconds; using min std::chrono::minutes; using traits jwt::traits::boost_json; using claim jwt::basic_claimtraits; std::string rsa_priv_key R(-----BEGIN PRIVATE KEY----- MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC4ZtdaIrd1BPIJ tfnF0TjIK5inQAXZ3XlCrUlJdPXHwIRxdv1FsN12XyMYO/6ymLmo9ryoQeIrsXB XYqlET3zfAYdiwCb0HEsVvhisthwMU4gZQu6TYW2s9LnXZB5rVtcBK69hcSlA2k ZudMZWxZcj0L7KMfO2rIvaHw/qaVOE9j0T257Z8Kp2CLF9MUgX0ObhIsdumFRLaL DvDUmBPr2zuh/34j2XmWwn1yjN/WvGtdfhXW79Ki1S40HcWnygHgLV8sESFKUxxQ mKvPUTwDOIwLFL5WtE8Mz7NkgmDcmWMCHc8kcOIu73Ta/3D4imW7VbKgHZo9K 3ESFE3RjAgMBAAECggEBAJTEIyjMqUT24G2FKiS1TiHvShBkTlQdoR5xvpZMlYbN tVWxUmrAGqCQ/TIjYnfpnzCDMLhdwT48Ab6mQJw69MfiXwc1PvwX1e9hRscGul36 ryGPKIVQEBsQG/zc4/L2tZe8utqeaK7XuYrPp8bk/X1e9qK5m7jJpKosNSLgJj NIbYsBkG2Mlq671irKYj2hVZeaBQmWmZxK4fw0Istz2WfN5nUKUeJhTwpRJLUg4 ELYYoB7EO0Cej9UBG30hbgu4RyXAVbptJH042K5QJROUbtnLWuuWosZ5ATldwO u03dIXL0SH0ao5NcWBzxU4F2sBXZRGP2x/jiSLHcqoECgYEA4qD7mXQpu1b8XO8U 6abpKloJCatSAHzjgdR2eRDRx5PMvloipfwqA77pnbjTUFajqWQgOXsDTCjcdQui wf5XAaWuTeAVTytLQbSiTsBhrnoqVrr3RoyDQmdnwHT8aCMouOgcC5thP9vQ8Us rVdjvRRbnJpg3BeSNimHu9AHgsCgYEA0EzcbOltCWPHRAY7B3Ge/AKBjBQr86Kv TdpTlxePBDVIlHBM6oct2gaSZZoHbqPjbq5v7yf0fKVcXE4bSVgqfDJ/sZQu9Lp PTeV7wkk0OsAMKk7QukEpPno5q6tOTNnFecpUhVLLlqbfqkB2baYYwLJR3IRzboJ FQbLY93E8gkCgYBzlC5VlQbbNqcLXJoImqItgQkkuW5PCgYdwcrSov2ve5r/Acz FNt1aRdSlx4176R3nXyibQA1VwztiUFowiP9WLoM3PtPZwwe4bGHmwGNHPIfwVG mexf9XgKKespYbLhc45tuC08DATnXoYK7O1EnUINSFJRS8cezSI5eHcbQKBgQDC PgqHXZ2aVftqCc1eAaxaIRQhRmYCgUjumaczRFGwVFveP9I6GdiKca3DE3F9Pq PKgejo0SwP5vDTrOGHN14bmGJUMsX9i4MTmZUZ5s8s3lXh3ysfTGAhTd6nKrIE kM3Nh6HWFhROptfc6BNusRh1kX/cspDplK5x8EpJ0QKBgQDWFg6S2je0KtbV5PYe RultUEe2C0jYMDQxJYxbPmtcopvZQrFEur3WKVuLy5UAy7EBvwMnZwIG7OOohJb vkSpADK6VPn9lbqq7O8cTedEHttm6otmLt8ZyEl3hZMaL3hbuRj6ysjmoFKx6CrX rK0/Ikt5ybqUzKCMJZg2VKGTxg -----END PRIVATE KEY-----); traits::value_type raw_value; traits::parse(raw_value, R##({api:{array:[1,2,3],null:null}})##); claim from_raw_json(raw_value); claim::set_t list{ once, twice }; std::vectorint64_t big_numbers{ 727663072ULL, 770979831ULL, 427239169ULL, 525936436ULL }; const auto time jwt::date::clock::now(); const auto token jwt::createtraits() .set_type(JWT) .set_id(rsa-create-example) .set_issuer(auth.mydomain.io) .set_audience(mydomain.io) .set_issued_at(time) .set_not_before(time) .set_expires_at(time min{ 2 } sec{ 15 }) .set_payload_claim(boolean, true) .set_payload_claim(integer, 12345) .set_payload_claim(precision, 12.3456789) .set_payload_claim(strings, claim(list)) .set_payload_claim(array, claim{ big_numbers.begin(), big_numbers.end() }) .set_payload_claim(object, from_raw_json) .set_payload_claim(sample, claim(std::string{ test })) .sign(jwt::algorithm::rs256(, rsa_priv_key, , )); const auto decoded jwt::decodetraits(token); std::cout token: token std::endl; for (auto e : decoded.get_header_json()) // get_payload_json std::cout e.key() e.value() std::endl; std::string rsa_pub_key R(-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuGbXWiK3dQTyCbX5xdE4 yCuYp0AF2d15Qq1JSXT/lx8CEcXb9RbDddl8jGDvspi5qPa8qEHiK7FwV2KpRE9 83wGPnYsAm9BxLFb4YrLYcDFOIGULuk2FtrPS512Qea1bXASuvYXEpQNpGbnTGVs WXI9CyjHztqyL2h8P6mlThPY9E9ue2fCqdgixfTFIF9Dm4SLHbphUS2iw7w1JgT 69s7of9I9l5lsJ9cozf1rxrXX4V1u/SotUuNB3Fp8oB4C1fLBEhSlMcUJirz1E8 AziMCxSVrRPDMzfvpIJg3JljAh3PJHDiLu902v9wIplu1WyoB2aPfitxEhRN0 YwIDAQAB -----END PUBLIC KEY-----); const auto array traits::as_array(decoded.get_payload_claim(object).to_json().as_object()[api].as_object()[array]); std::cout payload /object/api/array array std::endl;; jwt::verifytraits() .allow_algorithm(jwt::algorithm::rs256(rsa_pub_key, , , )) .with_issuer(auth.mydomain.io) .with_audience(mydomain.io) .with_claim(object, from_raw_json) .verify(decoded); } int test() { testToken(); // token有效验证 testTokenES256k(); // token加密验证依赖openssl testTokenRS256(); return 0; }输出typ JWTalg nonepayload /object/api/array [1,2,3]typ JWTalg ES256Kpayload /object/api/array [1,2,3]token: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJhdXRoLm15ZG9tYWluLmlvIiwiYXVkIjoibXlkb21haW4uaW8iLCJpYXQiOjE3MjQxMzY1NzMsIm5iZiI6MTcyNDEzNjU3MywiZXhwIjoxNzI0MTM2NzA4LCJib29sZWFuIjp0cnVlLCJpbnRlZ2VyIjoxMjM0NSwicHJlY2lzaW9uIjoxLjIzNDU2Nzg5RTEsInN0cmluZ3MiOlsib25jZSIsInR3aWNlIl0sImFycmF5IjpbNzI3NjYzMDcyLDc3MDk3OTgzMSw0MjcyMzkxNjksNTI1OTM2NDM2XSwib2JqZWN0Ijp7ImFwaSI6eyJhcnJheSI6WzEsMiwzXSwibnVsbCI6bnVsbH19fQ.abnNu6Cw15Bhw-KSyLRyNoczx277lC8X0T2qipZ6zujh_EWGZXzVqIkdgSPrXAmuC9fbOEgdgKoLGSTNvkw4iFX6bql8qcde91rr5wYtp_EnjMk8xM_Ootp6ETO5fF8jZSNdEWWLVpZQxFIm_IFogjbTAzySP4ZuQC1B4Gf_qVM0XAJMG1fW7Hwl_6VtW_SfXf9JEKrJB7d-Tex3aTm-BfRqKIQl0GclWuZtfmvvRmJuMpTr4OqhM7w8FDbavsbjvbNNZyr2tH5P0k8Zm6BWgjAD5y4vlsp0drb_NIaVay5J3VxhGnQ-aReVBfi_N3sbJrLF6vpruEwCnu084P4a-Atyp JWTalg RS256payload /object/api/array [1,2,3]参考GitHub - Thalhammer/jwt-cpp: A header only library for creating and validating json web tokens in c

相关推荐

HarmonyOS介绍真题
HarmonyOS介绍真题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 14:56:12

面试谈薪实战指南:一个被拒过、也被抢过的人,写给你的真心话
面试谈薪实战指南:一个被拒过、也被抢过的人,写给你的真心话

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 14:55:10

Sogou【同构】可对标taskflow的并行计算,网络请求并串发库
Sogou【同构】可对标taskflow的并行计算,网络请求并串发库

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 14:55:10

凝聚态物理与AI交叉研究:CMPAI 2026会议前瞻
凝聚态物理与AI交叉研究:CMPAI 2026会议前瞻

1. 会议背景与核心价值 2026凝聚态物理学与人工智能国际学术会议(CMPAI 2026)是跨学科领域的重要学术盛会,旨在搭建凝聚态物理学与人工智能研究的桥梁。这个会议之所以备受关注,是因为它抓住了当前科研领域最前沿的两个方向——凝… · 2026/11/2 21:00:02

C++异步读文件不卡主线程:线程模型、任务队列与避坑指南
C++异步读文件不卡主线程:线程模型、任务队列与避坑指南

C 里做本地文件读取,最容易踩的坑不是"读不出来",而是"读得太慢把界面卡死"。我见过太多项目,日志模块、配置加载、资源预载这些活儿全塞在主线程里同步干,小文件几十毫秒看不出来,一旦碰上几百兆… · 2026/11/2 21:00:02

NGO算法优化VMD参数在信号处理中的应用
NGO算法优化VMD参数在信号处理中的应用

1. 项目概述北方苍鹰优化算法(NGO)是一种新兴的智能优化算法,它模拟了北方苍鹰在捕猎过程中的搜索策略。这种算法在解决复杂优化问题时表现出色,特别是在处理非线性、多峰函数优化问题上具有明显优势。而变分模态分解(VMD)作为一种先进的信号处理方法&am… · 2026/11/2 21:00:02

VoiceStudio 实战:从录音降噪到 AI 合成,搭一条人声生产流水线
VoiceStudio 实战:从录音降噪到 AI 合成,搭一条人声生产流水线

VoiceStudio 这个名字我盯了挺久,最初以为是某个 DAW 换皮,后来完整搭了一条从收音、降噪、人声增强到 AI 辅助合成、最后打包成片的生产链路,才意识到它真正想解决的不是“录一段音”,而是把散落在录音、后期、配音、交付里的活全… · 2026/11/2 21:00:02

Clean Code实践:注释艺术与代码格式化指南
Clean Code实践:注释艺术与代码格式化指南

1. Clean Code中的注释艺术在编写高质量代码时,注释是一个经常被忽视但极其重要的组成部分。好的注释能够提升代码的可读性和可维护性,而糟糕的注释反而会成为代码的负担。我见过太多代码库中充斥着过时、误导性或者完全多余的注释,这些"… · 2026/11/2 21:00:02

AI内容格式转换全攻略:Typora、飞书与AI导出鸭对比
AI内容格式转换全攻略:Typora、飞书与AI导出鸭对比

1. 问题背景与痛点分析在日常使用DeepSeek等AI平台时,我们经常需要将生成的内容复制到Word文档中。但这个过程往往会遇到令人抓狂的格式问题:数学公式变成乱码、表格边框神秘消失、文字间距错乱不堪。这些问题不仅影响文档美观,更会严重降低工… · 2026/11/2 20:59:02

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18

雷达信号调制技术解析:从LFM到伪线性调频原理与应用
雷达信号调制技术解析:从LFM到伪线性调频原理与应用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 1:01:15

基于MAX14431与TM4C123的工业SPI隔离电路设计全攻略
基于MAX14431与TM4C123的工业SPI隔离电路设计全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 1:01:15

PLFM_RADAR:相位线性调频雷达信号处理框架
PLFM_RADAR:相位线性调频雷达信号处理框架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 1:01:15

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码