c++哈希函数对密码是否相当安全?

Is the c++ hash function reasonably safe for passwords?

本文关键字:安全 是否 密码 哈希 函数 c++      更新时间:2023-10-16

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

这是否合理安全?

远远不够安全,因为这个哈希函数不打算用于加密目的

实际上,即使是用于加密目的的哈希函数(例如现在已经损坏的MD5,旧的SHA1甚至是非常新的SHA3)也不意味着对存储的密码进行哈希;这是因为它们被设计为快速,而对于密码安全性,您希望哈希被设计为,以便在哈希泄露时限制损害。

如果你打算散列密码,你应该查找c++(或C,因为它们可能更容易找到)的bcrypt或PBKDF2实现;我知道Crypto++至少做到了后者。

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

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

有很多方法可以正确地散列。您需要包含一个salt来防止字典攻击。并且您希望散列多次(4k到16k)。