0

0

C++如何实现简易的配置项加密存储?(AES-GCM加解密集成)

冰火之心

冰火之心

发布时间:2026-02-21 13:39:36

|

545人浏览过

|

来源于php中文网

原创

应使用 std::vector 而非 std::string 存储密钥、nonce、密文和 tag,因 std::string 易因 \0 截断且被误作 c 字符串;aes-gcm 中 nonce 必须每次随机生成且严禁复用;解密失败仅表示认证失败,需记录完整上下文定位原因。

c++如何实现简易的配置项加密存储?(aes-gcm加解密集成)

为什么不用 std::string 直接存密钥和密文?

因为 AES-GCM 要求密钥、nonce、认证标签都必须是精确字节长度的二进制数据,std::string 容易隐式截断 \0 字节,读写文件时还可能被当成 C 风格字符串处理。一旦密文里有 \0,用 std::string::c_str() 传给 OpenSSL 或 Crypto++ 就会提前截断。

实操建议:

立即学习C++免费学习笔记(深入)”;

AMiner
AMiner

AMiner——新一代智能型科技情报挖掘与服务系统,能够为你提供查找论文、理解论文、分析论文、写作论文四位一体一站式服务。

下载
  • 统一用 std::vector<uint8_t></uint8_t> 存密钥、nonce、密文、tag —— 它不关心内容,只管字节长度
  • 配置项序列化前先转成 JSON 或 msgpack(不含 \0),再对整个二进制 blob 加密,别对每个字段单独加密
  • 如果非要存成文本(比如写进 ini 文件),用 Base64 编码加密后的 std::vector<uint8_t></uint8_t>,解码后再送进 AES-GCM

AES_GCM_encrypt 必须手动管理 nonce 且不能复用

同一个密钥下,重复使用 nonce 会导致 GCM 完全失效:攻击者可直接恢复明文,甚至伪造合法密文。这不是“建议避免”,是“绝对禁止”。

实操建议:

立即学习C++免费学习笔记(深入)”;

  • 每次加密都生成全新随机 nonce,推荐用 RAND_bytes(OpenSSL)或 CryptoPP::AutoSeededRandomPool
  • 把 nonce 和密文拼一起存储(例如:前 12 字节是 nonce,后面全是密文+tag),解密时先切出来
  • 别用时间戳、计数器当 nonce —— 没有持久化或并发时极易撞车;更别硬编码 {0}
  • 如果你用的是 EVP_CIPHER_CTX,记得调 EVP_EncryptInit_ex(ctx, nullptr, nullptr, key.data(), iv.data()),iv 就是 nonce

解密失败时,EVP_DecryptFinal_ex 返回 0 不代表“密码错”

它只表示认证失败(authentication failure),原因可能是:密钥错、nonce 错、密文被篡改、tag 被截断——但错误信息完全一样。你没法靠返回值区分是用户输错密码,还是配置文件损坏了。

实操建议:

立即学习C++免费学习笔记(深入)”;

  • 不要在日志里直接打 “decrypt failed”,而要记录完整上下文:config_pathkey_id、nonce 长度、密文长度、tag 长度
  • 加一层封装函数,比如 bool try_decrypt_config(const std::vector<uint8_t>& input, std::vector<uint8_t>& out)</uint8_t></uint8_t>,内部只返回 true/false,不暴露底层错误码
  • 调试阶段可临时启用 ERR_print_errors_fp(stderr),但上线必须关掉——它会泄露 OpenSSL 内部状态

静态链接 Crypto++ 时,CryptoPP::Exception 析构可能 crash

某些旧版 Crypto++(如 5.6.5)在静态链接 + 异常跨动态库边界时,CryptoPP::Exception 析构会 double-free。现象是解密失败后程序直接 abort,堆栈停在 ~Exception

实操建议:

立即学习C++免费学习笔记(深入)”;

  • 优先换用 OpenSSL 1.1.1+(系统自带或自己编译),它的 EVP 接口稳定,异常由 C 错误码控制,无此问题
  • 若必须用 Crypto++,升级到 8.2+,并确保所有代码(包括 config loader)都用同一份静态库编译,禁用 -fvisibility=hidden
  • 最稳妥做法:捕获 std::exception& 而非 CryptoPP::Exception&,避免类型切片
加密配置不是加个 AES 就完事,nonce 管理、错误归因、二进制边界处理,任何一个点没卡准,都会让“安全存储”变成“假安全”。尤其注意密文落地时的编码方式和加载时的零字节处理——这两处出问题,连调试都难定位。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

443

2023.08.07

json是什么
json是什么

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

544

2023.08.23

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

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

322

2023.10.13

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

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

81

2025.09.10

string转int
string转int

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

810

2023.08.02

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

549

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

595

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

217

2023.09.04

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

796

2026.02.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9.8万人学习

C 教程
C 教程

共75课时 | 4.9万人学习

C++教程
C++教程

共115课时 | 18.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号