C语言中用于密码(盐/哈希)的库?

6

有没有人知道在C语言中用于对密码进行盐值哈希的库或框架?我该如何在程序中实现这个功能?


2
哈希(Hashing)不是加密;-) - user166390
然而,它们密切相关,并且通常由相同的库提供,因此在我看来,这是一个有效的标签。 - Jonathon Reinhart
4个回答

7
我肯定会选择OpenSSL。请注意,当涉及到加密时,不要试图自己开发或仅仅找一些在互联网上发布的东西。选择像OpenSSL这样经过验证并且每天被数百万人信任的东西。自制和未正确实现的加密在我看来是互联网安全漏洞的主要原因之一。
正如Tibor所提到的,通常在哈希密码之前会添加一个salt。唯一的盐可以大大降低基于彩虹表的攻击的能力。

1
另一方面,如果你只需要计算哈希值,一个完整的库可能会过度杀伤,因为每个新的依赖项都会带来更多的复杂性。 - user267885
在 OpenSSL 中,你应该使用 evp.h 中的 PKCS5_PBKDF2_HMAC_SHA1() 函数。 - caf

6
我建议使用OpenSSL API。
1)如果您想使用密码生成密钥,请使用PKCS5_PBKDF2_HMAC_SHA1(),例如:
# include <openssl/evp.h>
int PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen,
                       unsigned char *salt, int saltlen, int iter,
                       int keylen, unsigned char *out);

或者

int EVP_BytesToKey(const EVP_CIPHER *type,const EVP_MD *md,
                          const unsigned char *salt,
                          const unsigned char *data, int datal, int count,
                          unsigned char *key,unsigned char *iv);

2.) 为了哈希密码,使用sha256而不是sha1(原因是更安全,已经对sha1安全性进行了尝试)

 # include <openssl/sha.h>
 SHA256_CTX context;
 unsigned char md[SHA256_DIGEST_LENGTH];

 SHA256_Init(&context);
 SHA256_Update(&context, (unsigned char*)input, length);
 SHA256_Final(md, &context);

所以,之后md将包含密码哈希值

3.) 盐值:盐值只是一些随机字节,但重点是采用加密安全的随机字节。为此,您可以使用:

# include <openssl/rand.h>

unsigned char salt[32];    //32 is just an example  
int RAND_bytes(salt,32);

2

在C语言中有许多哈希函数实现,我建议搜索C语言中的SHA1算法。如果这是唯一的加密功能,您可以复制一些代码片段,但否则您可以选择更高级的库,如OpenSSL或GNU Crypto。

另一方面,盐值通常只需将盐值附加到密码后即可进行,例如(伪代码)pwhash = hash(password + salt)


2
最流行的带哈希函数的C语言加密库包括OpenSSLBotan,如果你使用的是C++,可以选择Crypto++。此外,根据你所针对的平台和所需使用的哈希函数,Windows上有Win32加密函数,其他平台也有各自的本地库可供使用。请注意保留HTML标签,但不需要进行解释。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接