繁体   English   中英

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

[英]Library for passwords (salt/hash) in C?

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

我肯定会选择OpenSSL 请,当谈到加密时,不要尝试自己动手,或者只是找到有人发布在 Internet 上的东西。 使用像 OpenSSL 这样的东西,每天都有数百万人经过验证和信任。 在我看来,自制和不正确实施的加密是导致 Internet 安全漏洞的主要原因。

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

我会建议使用 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);

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM