使用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
相关产品推荐
相关产品推荐

