如何在C语言中实现生成字符串形式的简单密码哈希函数?
如何在C语言中生成正确的SHA256哈希字符串(使用OpenSSL)
我完全懂你遇到的麻烦:用openssl/sha.h生成的哈希结果和预期对不上,甚至连长度都不对——你提到的那个结果少了两位,这说明把二进制哈希值转换成十六进制字符串的环节肯定出了问题。SHA256的哈希值是256位(也就是32字节),对应的标准十六进制字符串应该是64个字符,少两位大概率是转换逻辑漏了细节。
下面是经过验证的完整代码,能生成符合标准的SHA256哈希字符串:
#include <stdio.h> #include <string.h> #include <openssl/sha.h> // 把二进制哈希值转换成十六进制字符串 void sha256_hash_string(unsigned char hash[SHA256_DIGEST_LENGTH], char outputBuffer[65]) { int i; // 每个字节转两位十六进制字符,用%02x确保不足两位补0 for(i = 0; i < SHA256_DIGEST_LENGTH; i++) { sprintf(outputBuffer + (i * 2), "%02x", hash[i]); } // 手动添加字符串终止符,避免乱码 outputBuffer[64] = '\0'; } // 对输入字符串计算SHA256哈希 void sha256_string(char *input, char outputBuffer[65]) { unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256_CTX sha256_ctx; SHA256_Init(&sha256_ctx); SHA256_Update(&sha256_ctx, input, strlen(input)); SHA256_Final(hash, &sha256_ctx); sha256_hash_string(hash, outputBuffer); } int main() { char input[] = "your_test_text_here"; char hash_result[65]; sha256_string(input, hash_result); printf("SHA256 hash of '%s': %s\n", input, hash_result); // 编译时记得链接OpenSSL库:gcc your_file.c -o your_file -lcrypto return 0; }
核心注意事项:
- 二进制转十六进制的正确姿势:一定要用
%02x格式符,它会保证每个字节都被转换成两位十六进制字符——比如字节值0x05会被转成"05"而不是"5",这几乎是你之前结果错误的核心原因。 - 缓冲区大小:输出字符串要预留65个字符的空间(64个哈希字符+1个字符串终止符),防止缓冲区溢出导致的异常。
- 编译链接要求:编译时必须加上
-lcrypto参数链接OpenSSL的crypto库,否则会出现函数未定义的错误。
为什么你之前的结果不对?
你给出的结果f3aefe62965a91903610f0e23cc8a69d5b87cea6d28e75489b0d2ca02ed7993c62只有62个字符,说明转换时至少有一个字节被转换成了一位字符,直接导致总长度少了两位,自然和标准哈希结果不匹配。
验证方法
你可以拿测试文本比如"test"来验证,标准SHA256哈希是9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08,用上面的代码输入"test",应该得到完全一致的结果。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

