You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用openssl/sha.h生成的SHA512与sha512sum命令结果不一致问题

解决OpenSSL SHA512哈希与sha512sum结果不一致的问题

首先看你贴的代码明显没写完,而且存在几个关键错误,这就是导致哈希结果和sha512sum不一致的核心原因。我帮你梳理问题并给出修复后的完整代码:

你的代码里的核心问题

  • 代码不完整:写到unsigned char data就中断了,缺少文件内容读取、哈希更新、最终计算以及结果输出的关键逻辑,根本没法生成正确的哈希值。
  • 内存分配错误:malloc(sizeof(int))分配的空间太小了!比如当j=255时,文件名是FF.txt,光这个字符串就需要6个字符(加上字符串结束符\0是7个),而sizeof(int)通常是4,这会导致缓冲区溢出,覆盖其他内存,结果完全不可控。
  • 缺少SHA512计算的标准流程:你只定义了SHA512_CTX,但没有调用SHA512_Init初始化上下文、SHA512_Update更新哈希数据、SHA512_Final生成最终哈希值,这三步是OpenSSL计算哈希的核心。
  • 文件处理不严谨:打开文件后没检查是否成功(比如文件不存在时fopen会返回NULL),用完文件没关闭,分配的内存也没释放,这些都可能导致异常。

修复后的完整代码

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <openssl/sha.h>

int main() {
    int j;
    // 打开保存哈希结果的文件,用文本模式更方便查看
    FILE *hash_file = fopen("hash.txt", "w");
    if (!hash_file) {
        perror("Failed to open hash.txt");
        return 1;
    }

    for(j = 0; j < 256; j++) {
        // 用栈上的数组存文件名,比malloc更安全,避免内存泄漏
        char fileName[10];
        sprintf(fileName, "%X.txt", j);

        FILE *file = fopen(fileName, "rb");
        if (!file) {
            fprintf(stderr, "Failed to open %s\n", fileName);
            continue;
        }

        SHA512_CTX mdcontext;
        unsigned char md[SHA512_DIGEST_LENGTH];
        unsigned char data[1024];
        int bytes;

        // 1. 初始化SHA512上下文
        SHA512_Init(&mdcontext);
        // 2. 循环读取文件内容,更新哈希
        while ((bytes = fread(data, 1, sizeof(data), file)) > 0) {
            SHA512_Update(&mdcontext, data, bytes);
        }
        // 3. 生成最终哈希值
        SHA512_Final(md, &mdcontext);

        // 将哈希值写入hash.txt,格式和sha512sum一致(十六进制+空格+文件名)
        for (int i = 0; i < SHA512_DIGEST_LENGTH; i++) {
            fprintf(hash_file, "%02x", md[i]);
        }
        fprintf(hash_file, "  %s\n", fileName);

        // 关闭文件,避免资源泄漏
        fclose(file);
    }

    fclose(hash_file);
    return 0;
}

编译与验证

编译时记得链接OpenSSL库:

gcc your_code.c -o sha512_hash -lcrypto

运行后,你可以用sha512sum验证单个文件的哈希,比如:

sha512sum 0.txt

然后对比hash.txt里对应的行,结果应该完全一致。

补充说明

  • 用栈数组char fileName[10]代替malloc,既安全又不用手动释放内存,避免了内存泄漏问题。
  • 增加了文件打开失败的错误处理,方便排查问题。
  • 哈希输出格式和sha512sum保持一致(小写十六进制,空格加文件名),方便直接对比。

内容的提问来源于stack exchange,提问作者Iman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:25:00