C++哈希函数对于密码来说足够安全吗?

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

这个是否相对安全呢?

1
你是否能接受几个不同的密码被映射到完全相同的哈希值? - AlexK
3
我会说不是。安全.stackexchange.com可能是更好的权威答案来源。 - chux - Reinstate Monica
@Nirk 适用于加密目的。 - MarJamRob
2
@MarJamRob 答案是绝对不 - Captain Obvlious
2个回答

20

这个哈希函数绝不是为了加密目的而设计的,因此它的安全性远不能得到保障

实际上,即使是用于加密目的的哈希函数(例如现在已经破解的MD5,老旧的SHA1甚至是非常新的SHA3),也不适合用于对存储密码进行哈希;这是因为它们旨在快速处理数据,而对于密码安全,您需要一种旨在缓慢处理数据以限制泄漏哈希值造成的损害。

如果您打算对密码进行哈希,应该查找C ++(或C)实现的bcryptPBKDF2; 我知道Crypto ++至少支持后者。

有关安全哈希密码的详细分析,请参见如何安全地哈希密码


1
抱歉,您能提供一些支持后面的说法吗? - Balog Pal
1
@BalogPal:http://crypto.stackexchange.com/questions/24/what-makes-a-hash-function-good-for-password-hashing - Jon
对于原始陈述并不是很令人信服。您可以通过多次执行哈希算法来生成自定义的缓慢程度。使用该数量本身作为一种盐。在您的哈希检查器上校准该数量。将单个真实要求留给哈希函数,以确保其是安全的单向的。(当然,使用系统可以获得安全性,并基于威胁模型,而不仅仅是将几个首字母缩写粘在一起并希望能够获得安全性,但这需要更深入的探讨。) - Balog Pal
2
@BalogPal:当然,这就是每个人都推荐使用的两种广泛使用的算法。但为什么要重复造轮子呢?此外,我们是否可以合理地假设我、你或任何想要散列一些密码的人都知道与创建这些方法的人一样多的隐藏陷阱呢? - Jon
为了澄清一点,我绝对不反对建议的算法,只是觉得你的陈述(第二段)过于模糊,建议适度精简。并且请添加此链接:http://security.stackexchange.com/questions/211/how-to-securely-hash-passwords - Balog Pal
@BalogPal:提出了公正的观点,已经考虑到了。感谢您的建议。 - Jon

0

当人们谈论哈希密码时,它并不是指哈希表的意义。密码哈希应该是单向函数。像SHA1这样的加密哈希是你想要使用的。

有许多正确的哈希技术。你需要包含一个盐来防止字典攻击。而且你想要哈希多次(4k到16k次)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接