C++如何实现文件内容的哈希校验_C++计算文件MD5或SHA256值【安全】-C++

用 OpenSSL 实现文件 MD5/SHA256 计算(推荐)

直接调用系统级加密库是最可靠的方式,OpenSSL 提供了稳定、经过审计的哈希实现。Windows/macOS/Linux 均可编译使用,关键是避免自己手写分块读取逻辑出错。

常见错误是把整个文件 fread 到内存再哈希——大文件(如 >1GB)会触发 OOM 或显著拖慢速度;正确做法是分块读取、增量更新哈希上下文。

  • 链接时需加 -lssl -lcrypto(Linux/macOS),Windows 需配置 OpenSSL 的 .lib 路径
  • MD5 用 EVP_MD_CTX_new + EVP_md5,SHA256 用 EVP_sha256,别混用 MD5_Init 这类旧接口(已弃用且线程不安全)
  • 每次 EVP_DigestUpdate 前检查返回值,0 表示失败(如输入为 nullptr)
  • 哈希结果是二进制字节,转十六进制字符串需手动循环转换,别用 printf("%x") 直接输出——会丢前导零且大小端混乱

跨平台 C++ 封装:一个轻量 file_hash 函数

下面是一个只依赖 和 OpenSSL 头的封装示例,支持 MD5/SHA256,自动处理 8KB 分块和错误流关闭:

std::string file_hash(const std::string& path, const EVP_MD* md) {
    std::ifstream file(path, std::ios::binary);
    if (!file.is_open()) return "";
EVP_MD_CTX* ctx = EVP_MD_CTX_new();
if (!ctx || EVP_DigestInit_ex(ctx, md, nullptr) != 1) {
    EVP_MD_CTX_free(ctx);
    return "";
}

std::vector buf(8192);
while (file.read(reinterpret_cast(buf.data()), buf.size())) {
    if (EVP_DigestUpdate(ctx, buf.data(), file.gcount()) != 1) break;
}
// 处理剩余不足一整块的数据
if (file.gcount() > 0) {
    EVP_DigestUpdate(ctx, buf.data(), file.gcount());
}

unsigned int len;
std::vector digest(EVP_MD_size(md));
EVP_DigestFinal_ex(ctx, digest.data(), &len);
EVP_MD_CTX_free(ctx);

std::stringstream ss;
for (unsigned int i = 0; i < len; ++i) {
    ss << std::hex << std::setw(2) << std::setfill('0') << (int)digest[i];
}
return ss.str();

}
// 使用:file_hash("input.bin", EVP_sha256());

不用 OpenSSL?用 std::filesystem + 算法库(C++23 起有限支持)

C++23 标准库仍未内置密码学哈希,所谓“标准方案”实际不存在。网上有些代码用 std::hash 是完全错误的——它不是密码学哈希,不可用于校验,碰撞率极高且无固定输出长度。

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

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C++如何实现文件内容的哈希校验_C++计算文件MD5或SHA256值【安全】-C++
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4022694+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4022694+
  • 本周更新: 0+
  • 最后更新: 2026-03-16