c - 在 C 编程中使用 openssl 带盐的 MD5/SHA1 哈希

标签 c hash openssl salt

我需要一个示例代码,向我展示如何使用 openssl 库对带有盐的字符串进行哈希处理。 我应该提到,我知道如何在不加盐的情况下做到这一点,正如您在这段代码中看到的:

#include <openssl/sha.h>

bool simpleSHA256(void* input, unsigned long length, unsigned char* md)
{
    SHA256_CTX context;
    if(!SHA256_Init(&context))
        return false;

    if(!SHA256_Update(&context, (unsigned char*)input, length))
        return false;

    if(!SHA256_Final(md, &context))
        return false;

    return true;
}

我的问题是关于向哈希函数添加盐,类似这样,但使用 openssl 库:

char salt[2];  /* Salt for the crypt() function  */
const char *salt_chars = "abcdefghijklmnopqrstuvwxyz" /* Range of character supported   */
                         "ABCDEFGHIJKLMNOPQRSTUVWXYZ"  /* as a value for salt in crypt() */
                         "0123456789";
char password1[BUFSIZ], *buf;

/* Build salt */
srand(time(NULL));
salt[0] = salt_chars[rand() % 62];
salt[1] = salt_chars[rand() % 62];

buf = crypt(password, salt);

谢谢

最佳答案

加盐只是在应用哈希函数之前将盐连接到数据中。 盐应该是随机的,并且永远不会重复,目标是击败预先计算的彩虹表。当检查数据(密码)完成时,盐应该与哈希值一起存储。

根据您的代码,在数据前面连接盐(未经任何测试):

bool simpleSHA256(void * salt, unsigned long salt_length, void* input, unsigned long length, unsigned char* md) 
{
    SHA256_CTX context;
    if(!SHA256_Init(&context))
        return false;

    // first apply salt
    if(!SHA256_Update(&context, (unsigned char*)salt, salt_length))
        return false;

    // continue with data...
    if(!SHA256_Update(&context, (unsigned char*)input, length))
        return false;

    if(!SHA256_Final(md, &context))
        return false;

    return true; 
}

关于c - 在 C 编程中使用 openssl 带盐的 MD5/SHA1 哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20729137/

相关文章:

c++ - 设置的最低有效位的位置

hash - yii CPasswordHelper : hashPassword and verifyPassword

algorithm - 用于无序 ID 集的良好哈希函数

c - 实现二次探测和链接 - 搜索字典

c++ - Visual Studio 2015 (C++) 代码大小

c - 使用循环范围变量写入内存并从外部访问它

c++ - 从 ECDSA 公钥生成比特币地址

python - Heartbleed 接收哪些类型的数据?

c - 用 C 打开 LDAP 客户端 - 如何替换已弃用的 API

php - 通过 mcrypt 加密并通过 openssl 使用模式 CBC 和密码 BLOWFISH 解密