新闻中心

C++如何实现MD5或SHA256哈希?(使用OpenSSL库)

2025-12-16
浏览次数:
返回列表
使用OpenSSL的EVP接口计算SHA256或MD5摘要最稳妥:先EVP_MD_CTX_new,再EVP_DigestInit_ex选算法,EVP_DigestUpdate分段输入,EVP_DigestFinal_ex获取二进制结果,最后转十六进制;注意错误检查、内存释放及线程安全。

c++如何实现md5或sha256哈希?(使用openssl库)

直接用 OpenSSL 的 EVP 接口是最稳妥、跨平台且符合现代实践的方式。别碰老的 MD5()SHA256() 单独函数,它们已弃用且不支持流式计算。

1. 编译前准备:链接 OpenSSL 库

确保系统已安装 OpenSSL 开发包(如 Ubuntu 上 sudo apt install libssl-dev),编译时加链接选项:

g++ your_file.cpp -lssl -lcrypto

Windows 下若用 MinGW 或 MSVC,需对应配置 OpenSSL 的头文件路径和 .lib/.a 文件。

2. 用 EVP 接口计算字符串的 SHA256(推荐写法)

以下代码适用于任意长度输入,支持增量更新(可用于大文件或网络流):

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

说明:先初始化上下文(EVP_MD_CTX_new),选算法(EVP_sha256()),更新数据(EVP_DigestUpdate),最后获取摘要(EVP_DigestFinal_ex)。

Ghostwriter Ghostwriter

Replit推出的AI编程助手,一个强大的IDE,编译器和解释器。

Ghostwriter 238 查看详情 Ghostwriter

建议步骤:

  • 调用 EVP_MD_CTX_new() 创建上下文
  • EVP_DigestInit_ex(ctx, EVP_sha256(), nullptr) 初始化
  • 多次调用 EVP_DigestUpdate(ctx, data, len) 输入数据(可分段)
  • EVP_DigestFinal_ex(ctx, md, &md_len) 获取 32 字节二进制结果
  • printf("%02x", md[i]) 转成十六进制字符串(共 64 个字符)
  • 别忘了 EVP_MD_CTX_free(ctx) 清理

3. MD5 同理,只换算法名即可

把上面的 EVP_sha256() 换成 EVP_md5(),摘要长度变为 16 字节(32 位 hex 字符串)。注意:MD5 不再安全,仅用于兼容或校验场景,不要用于密码或签名。

关键区别:

  • MD5 输出长度:16 字节;SHA256:32 字节
  • 对应宏:EVP_md5() / EVP_sha256()
  • 缓冲区大小要匹配(unsigned char md[32] 对 SHA256,[16] 对 MD5)

4. 常见坑和提醒

避免踩这些雷:

  • 忘记检查 EVP_DigestInit_ex 返回值(失败返回 0)
  • 传入空指针给 EVP_DigestUpdate 且长度非零(崩溃)
  • 用完不 EVP_MD_CTX_free → 内存泄漏(尤其循环中)
  • 误以为 EVP_DigestFinal_ex 会自动以 null 结尾 —— 它只写二进制,转 hex 需手动格式化
  • 在多线程中复用同一个 EVP_MD_CTX* → 必须每个线程独立创建

基本上就这些。EVP 接口统一、安全、可扩展,以后换成 SHA512 也只需改一行。

以上就是C++如何实现MD5或SHA256哈希?(使用OpenSSL库)的详细内容,更多请关注其它相关文章!


# 编解码  # 营销美颜相机怎么做推广  # 江阴网站优化推广企业  # 天门网站建设美丽  # 灵寿网站建设开发招聘  # 新公司 seo方案  # 哪些网站推广发动机  # seo页面隐含区域  # 北京高端网站建设模版  # 游民星空网站建设文案  # 上市seo优化  # 相关文章  # 适用于  # 只需  # windows  # 客户端  # 网络编程  # 尼克  # 如何实现  # 多线程  # 如何使用  # crypto  # 区别  # win  # c++  # ssl  # ubuntu  # 字节 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Go RPC HTTP服务正确实现与常见陷阱解析  处理Kafka消费者会话超时:深入理解消息处理语义与幂等性  深入理解Promise链:如何在catch后中断then的执行  漫蛙2漫画入口 漫蛙正版网页漫画直达网址  QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台  Typer应用中动态命令行参数的解析与处理  css卡片内容溢出如何处理_使用overflow隐藏或scroll显示内容  iCloud登录入口网页版 苹果iCloud官网登录  抖音网页版怎么|直播|_抖音网页版开播操作指南  php源码怎么看淘宝客系统_看php源码淘宝客系统技巧  Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  GemBox Document HTML转PDF垂直文本渲染问题及解决方案  德邦快递查询平台 德邦快递物流信息查询入口  韩剧圈正版入口页面_韩剧圈官网登录链接  Discord Slash 命令响应超时问题的异步解决方案  深入理解J*aScript Promise异步执行与微任务队列  J*aScript设计模式实践_j*ascript代码优化  必由学官网首页入口 必由学教师网页版登录指南  126邮箱手机版登录官网2026_126手机邮箱免费入口最新  Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值  J*aScript异步迭代器_j*ascript异步遍历  汽水音乐在线版入口_汽水音乐网页播放手册  天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南  PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误  三星GalaxyZFold5怎样在相册制作折叠屏分镜_iPhone三星GalaxyZFold5相册制作折叠屏分镜【创意编辑】  MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId  163邮箱登录密码 163邮箱忘记密码找回  服务端验证_j*ascript输入检查  J*aScript数据结构转换:将对象数组按类别分组  CSS布局:解决全屏元素100%尺寸与外边距导致的页面溢出问题  Win11怎么设置鼠标主按键_Win11鼠标左右键功能互换  最新韩小圈网页版登录入口_官网在线观看官方链接  Fabric模组开发:自定义物品与物品组的现代管理方法  一加手机电池耗电快怎么办_一加手机电池耗电快的解决方法  HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全  Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略  免费抖音短视频入口_抖音网页版短视频免费通道  lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法  如何使 Jest 模拟函数默认抛出错误以提高测试效率  C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责  c++中的std::launder有什么实际用途_c++对象生命周期与指针优化  深入理解与实现最大堆的Heapify过程:常见错误与修正  C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言  狙击外星人小游戏开始_狙击外星人小游戏立即开始  如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率  J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程  在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明  qq游戏跨平台入口_qq游戏多设备同步登录  mcjs网页版在线存档 mcjs云存档登录入口  谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作 

搜索