使用MD5或SHA1进行密码哈希仍然有效吗?

5

我现在正在处理一个金融项目。团队考虑使用MD5来进行密码哈希

但是,今天很容易复制SHA1MD5密码进行解密,即使它们是像My$uper$ecur3PAS$word+448这样的复杂密码,你也可以使用在线页面进行解密。

小型和中型开发者(包括我)使用这些哈希方法,但我认为这不足以提供对数据库的安全保障。(除了防火墙网络安全iptables等)。

有人能给我一些关于如何解决这种漏洞的线索吗?

2个回答

8
根据OWASP密码存储备忘单,建议如下:
  • Argon2是密码哈希竞赛的获胜者,并应视为新应用程序的首选;
  • 如果需要FIPS认证或在许多平台上需要企业支持,则使用PBKDF2;
  • 如果需要抵抗任何/所有硬件加速攻击但不提供支持,则使用scrypt。
  • 如果没有PBKDF2或scrypt支持,则使用bcrypt。

对于大多数安全相关用例,MD5和SHA1都不安全,因为可以找到这些算法的碰撞。换句话说,给定一个输入及其哈希值,可以推导出具有相同哈希值的另一个输入。

SHA-2哈希算法组在许多安全用例中是安全的,但在密码哈希方面不是,因为与上述算法相比,它们非常快速。我们不希望密码哈希具有高性能,因为这会使攻击者尝试广泛范围的密码并在短时间内进行暴力攻击变得更容易。

上述4种算法因此在内存、计算能力和时间方面都是昂贵的。这些值通常被参数化,以便随着时间的推移,可以将它们调整为高值,以提高计算能力。因此,在使用这些算法时,选择正确的工作因素值非常重要。设置一个非常低的值可能会使目的失败。
除此之外,还应该使用盐。
同样来自OWASP来源:
生成每个存储凭据的唯一盐(不仅仅是每个用户或系统范围内);
使用密码学强度的随机数据;
尽可能使用32字节或64字节的盐(实际大小取决于保护函数);
方案安全性不依赖于隐藏、分割或以其他方式混淆盐。
盐有两个目的:
防止受保护的形式显示两个相同的凭据;并且
增加熵馈入保护函数,而不依赖于凭据复杂性。
第二个目的旨在使针对单个凭据的预先计算的查找攻击和针对人群的基于时间的攻击变得棘手。

1
碰撞并不是哈希密码时的问题,正如您所提到的那样,问题在于速度。只是为了更清楚地说明,使用GPU可以每秒计算高达200亿个MD5。 - martinstoeckli

6

你的想法是正确的,MD5和SHA1都不应该用于密码哈希。我建议按照以下顺序使用:

  • argon2
  • bcrypt
  • scrypt
  • PBKDF2

如果您标记您所使用的语言/框架,我可以推荐特定的库或方法。

另外,请注意这里不应该使用“加密”一词。这些是密码哈希算法,而不是加密算法。


嗯,这是一个普遍的问题。基本上,Node/Js、Python、C#和PHP对于大多数Stack Overflow用户来说都是受欢迎且有用的。 - Benjamin RD
偏好顺序是你的偏好还是安全专家的偏好(或两者兼而有之)? - Jesse C. Slicer
我想说两者都可以,但公正起见,意见不一。通常认为 (argon2、bcrypt、scrypt) > (PBKDF2)。但在这个领先的组中,意见往往有所不同。我会认为,实际上,argon2、bcrypt或scrypt 中的任何一个都是完全可以接受的选择。 - Luke Joshua Park

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