C中的密码(盐/哈希)库?

时间:2012-04-23 00:24:49

标签: c hash passwords

有人知道要在C中加密和散列密码的库或框架吗?我将如何在一个程序中执行此操作?

4 个答案:

答案 0 :(得分:6)

我肯定会选择OpenSSL。请注意,在加密方面,请不要尝试自己动手,或者只是找到某人在互联网上发布的内容。使用经过验证的OpenSSL,每天都有数百万人信任。在我看来,家庭酿造和不正确实施的加密是互联网上安全漏洞的主要原因。

正如Tibor所提到的,在散列之前,通常会在密码中附加一个salt。独特的盐会大大降低彩虹表攻击的能力。

答案 1 :(得分:2)

我建议使用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。)SALT:salt只是一些随机字节,但重点是加密安全随机字节。为此,您可以使用:

# include <openssl/rand.h>

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

答案 2 :(得分:1)

在C中有许多散列函数实现,我建议在C中搜索SHA1算法。如果这是唯一的加密功能,你可以只复制一些片段,否则你可以去更高级的库,如OpenSSL或GNU Crypto

另一方面,只需将盐附加到密码即(伪代码)pwhash=hash(password+salt)即可完成盐析。

答案 3 :(得分:1)

最流行的具有散列函数的C加密库是OpenSSLBotan,如果您使用的是C ++,Crypto++。此外,根据您要使用的目标和散列函数的平台,您可以在Windows上使用Win32加密函数,在不同平台上使用其他本机库。