C语言中的密码库(salt/hash)?

C语言中的密码库(salt/hash)?,c,hash,passwords,C,Hash,Passwords,有没有人知道用C编写密码的库或框架?在一个程序中,我该怎么做呢?我肯定会同意。请,当涉及到加密时,不要试着使用你自己的,或者只是在互联网上找到某人发布的东西。使用类似OpenSSL的东西,它每天都经过数百万人的验证和信任。在我看来,自制软件和未正确实施的加密是互联网安全漏洞的主要原因 正如Tibor提到的,在散列之前,通常会在密码中添加一个salt。唯一的salt会大大降低基于rainbow表的攻击能力。C中有许多哈希函数实现,我建议在C中搜索SHA1算法。如果这是唯一的加密功能,您可以复制一些

有没有人知道用C编写密码的库或框架?在一个程序中,我该怎么做呢?

我肯定会同意。请,当涉及到加密时,不要试着使用你自己的,或者只是在互联网上找到某人发布的东西。使用类似OpenSSL的东西,它每天都经过数百万人的验证和信任。在我看来,自制软件和未正确实施的加密是互联网安全漏洞的主要原因


正如Tibor提到的,在散列之前,通常会在密码中添加一个salt。唯一的salt会大大降低基于rainbow表的攻击能力。

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


盐,另一方面,简单地通过将盐加到密码中(即伪代码)<代码> Phash=Hash(密码+盐)。< /P> < P>最流行的具有散列函数的C密码库是,如果你是C++的。此外,根据您的目标平台和要使用的哈希函数,您可以在Windows和其他用于不同平台的本机库上使用Win32 crypto函数。

我建议使用Openssl API

1.)如果要使用密码生成密钥,请使用
PKCS5\u PBKDF2\u HMAC\u 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);
2.)要散列密码,请使用sha256而不是sha1(原因是更安全,并且已经尝试使用sha1安全)

#包括
SHA256_CTX上下文;
无符号字符md[SHA256_摘要_长度];
SHA256_初始化(和上下文);
SHA256_更新(&上下文,(无符号字符*)输入,长度);
SHA256_期末考试(md和上下文);
因此,在此之后,md将包含密码哈希

3.)SALT:SALT只不过是一些随机字节,但重点是takecrypto-secure随机字节。为此,您可以使用:

# include <openssl/rand.h>

unsigned char salt[32];    //32 is just an example  
int RAND_bytes(salt,32);
#包括
无符号半焦盐[32]//32只是一个例子
int RAND_字节(salt,32);

(散列不是加密;-)但是,它们密切相关,通常由相同的库提供,因此是这个问题的有效标记,IMO。另一方面。。。如果您只需要计算一个散列,那么一个完整的库可能是一种过度杀伤力,因为每个新的依赖项都会带来更多的复杂性……在OpenSSL中,您应该使用的函数是
PKCS5\u PBKDF2\u HMAC\u SHA1()
from
evp.h
 # 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);
# include <openssl/rand.h>

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