c ++中的内置哈希函数对于散列密码是否相当安全?例如下面的内容。
#include <iostream>
#import <string>
int main ()
{
std::hash <std::string> hash;
std::string passwordGuess;
unsigned long hashedPassword = 1065148159544519853; // hash of password
std::cout << "Enter your password: ";
std::cin >> passwordGuess;
unsigned long hashedPasswordGuess = hash(passwordGuess);
if (hashedPasswordGuess == hashedPassword) {
std::cout << "Password is correct!" << std::endl;
} else {
std::cout << "Password is wrong!" << std::endl;
}
}
这是否合理安全?
答案 0 :(得分:15)
远远没有合理安全,因为此哈希函数不打算用于加密目的。
实际上,即使用于加密目的的打算的哈希函数(例如现在已损坏的MD5,旧的SHA1,甚至是新的SHA3)也不适用于散列存储密码;这是因为它们被设计为快速,而对于密码安全性,您需要设计为慢的哈希值,以便在哈希值泄露时限制损坏。
如果您打算哈希密码,您应该查找bcrypt或PBKDF2的C ++(或C,因为它们可能更容易找到);我知道Crypto++至少会影响后者。
有关散列密码的详细分析,另请参阅how to securely hash passwords。
答案 1 :(得分:1)
当人们谈论散列密码时,它不在散列表的意义上。密码哈希应该是单向函数。像SHA1这样的加密哈希就是你想要使用的。
有很多技术可以正确散列。您需要包含一个盐来防止字典攻击。并且你想要多次(4k到16k)哈希。