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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:44:11