5

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;
    }
}

这是否合理安全?

4

2 回答 2

20

远非相当安全,因为此散列函数不打算用于加密目的

实际上,即使是用于加密目的的散列函数(例如现在损坏的 MD5、旧的 SHA1 甚至是非常新的 SHA3)也不适用于散列存储的密码这是因为它们的设计速度很快,而为了密码安全,您希望散列设计得一些,以限制散列泄露时的损害。

如果您打算对密码进行哈希处理,您应该查找bcryptPBKDF2的 C++(或 C,因为它们可能更容易找到)实现;我知道Crypto++至少做到了后者。

有关散列密码的详细分析,另请参阅如何安全地散列密码

于 2013-06-01T22:44:33.217 回答
0

当人们谈论散列密码时,它不是散列表的意义。密码哈希应该是单向函数。加密哈希,如 SHA1,是您想要使用的。

散列权有很多技术。您需要包含盐以防止字典攻击。并且您想要散列多次(4k 到 16k)次。

于 2013-06-01T22:47:55.637 回答