c++哈希函数对密码是否相当安全?
Is the c++ hash function reasonably safe for passwords?
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)。
相关文章:
- 通过网络、跨平台传递std::变体是否安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 在函数结束后使用指向变量的指针是否安全?
- 逐字节删除 void* 是否安全?
- 在 RAII 构造中修改 RVO 值是否安全?
- 线程调用的函数对对象删除是否安全?
- 将对象的字节复制到数组并再次复制回来是否安全
- std::memmove在同一对象之间是否始终安全
- 使用枚举为数组编制索引是否安全?
- 返回从字符串文本创建的静态string_view是否安全?
- 在cstlib中将#include_next替换为#include是否安全
- 由并发无序映射查找线程调用的函数是否安全?
- 使用 c++ 原子时编写"y=++x"是否安全?
- 从另一个线程发出信号是否安全?
- 从其存储的回调中删除 std::函数是否安全
- 使用 std::vector::swap 方法在C++中交换两个不同的向量是否安全?
- 当我在C++中调用 struce 的只读静态成员时,线程是否安全
- 同时调用 ASIO 对象的 API 是否安全?