用于密码存储的 sha256 + salt 哈希有多安全

信息安全 密码 Web应用程序 哈希 php sha256
2021-08-11 10:23:57

我最近开始在多个站点上阅读有关密码散列的信息,例如crackstation和其他网站上的这个页面,据我所知,我应该避免使用像md5 和sha1 这样的散列算法,因为它们已经过时了,相反,我应该使用带有salt 的sha256。但是,在阅读了 php 手册上的这个页面后,我注意到他们甚至不鼓励使用 sha256,而是建议使用 password_hash() 函数。我还注意到大多数文章/页面是在 2011-13 年期间编写的,所以我不确定现在使用盐的 sha256 哈希密码有多安全,以及它是否仍应在 webapps 中使用。

3个回答

十多年来,通用哈希已被淘汰用于密码。问题是它们速度快,而且密码熵低,这意味着使用任何通用哈希都很容易进行暴力破解。您需要使用故意缓慢的函数,例如 PBKDF2、bcrypt 或 scrypt。如果您阅读整个页面,Crackstation 实际上会解释这一点。另一方面,MD5 和 SHA-1 在密码散列的上下文中并不弱于 SHA-2;他们的弱点与密码无关。

正如@cpast 所说,单个 SHA-256 的主要问题是它太快了。拥有现成游戏 GPU 的攻击者可以以每秒数十亿的速度尝试密码(美国数十亿,但这仍然很多)。

另一个问题是有可能不正确地组合事物。SHA-256 是一种散列函数:它接受一个输入并产生一个输出。如果你给 SHA-256 提供密码盐,那么你实际上是在定义你自己的加密协议,基于 SHA-256 有一些额外的东西,这些额外的东西告诉密码和盐是如何组合成 SHA- 256 输入。众所周知,设计加密协议很困难,特别是因为没有可靠的安全测试。你无法知道你是否做对了。(好吧,当您的服务器成为来自您从未听说过的十几个不同国家/地区的黑客的主机时,您就知道您做错了,但为时已晚......)

正确的密码散列有一个理论。阅读此答案作为该主题的入门读物。

sha256 并非旨在散列密码。要散列密码,您应该更喜欢使用为此用途创建的散列函数。您将在解决类似请求的另一个问题中找到以下所有必需信息:最安全的密码哈希算法?.

在上面提到的问题中,您将了解为什么像 sha256 这样的通用哈希函数没有正确的属性来确保密码的安全存储(即使在其自身上多次应用),您还会发现排名为最推荐的专用于安全密码处理的哈希函数:

  1. scrypt:它仍然很新(2012 年发布),但旨在确保比其前身 bcrypt 更好的安全性,
  2. bcrypt:专为密码存储而设计,长期以来一直是推荐的选择,
  3. PBKDF2:它实际上被设计成一个关键的拉伸功能,即。一种从给定密码派生加密密钥的安全方法,但其属性使其也适用于密码存储。

在您的问题中,您提到了 PHP 函数password_hash()此函数本身不是哈希算法。事实上,这个函数用于允许 PHP 选择最受信任的可用密码哈希算法,而无需修改您的代码。

如文档中所述,根据 PHP 5.5.0,默认选择 bcrypt。