【问题标题】:Password hashing and salts in PHPPHP中的密码哈希和盐
【发布时间】:2014-06-09 14:25:05
【问题描述】:

我正在开发一个(尽量)超级安全的网站。我阅读了很多关于密码散列和使用盐的信息,但并不是所有事情对我来说都很清楚。我想将 sha-256 哈希算法与盐一起使用。我知道所有盐都应该是每个用户每个密码唯一的。

我想知道如果我也使用密码作为盐怎么办?使用 sha256 对密码进行哈希处理,然后使用其他算法对其进行哈希处理并将其用作盐。这样我就不必将盐存储在数据库中。这可能吗?还是我应该生成一个随机字符串?

【问题讨论】:

  • 不,使用password_hash - 这是使用 PHP 散列和加盐密码的标准方法。这样做的想法是散列算法故意很慢,并且不能并行化,而 SHA-256 可能太快了。如果你的散列算法很快,那么散列密码可以通过暴力搜索得到。
  • 这不是同一个问题,但有一个很好的描述,谢谢。也许我不是很清楚。我也想以哈希形式使用我的密码作为盐。
  • 您可以为我建议的算法提供盐。但是,将密码本身用作盐并不常见 - 盐是每个用户(例如他们的用户名)可以存储在用户表中未加密和未散列的东西。它旨在使破解密码的计算成本很高,因为必须为每个用户生成彩虹表。底线:由于我不是密码学家,我只会使用推荐的方法。

标签: php hash passwords salt


【解决方案1】:

不,那仍然是一种单向算法。

如果另一个用户使用相同的密码,哈希值将与第一个用户的密码相同。这忽略了每个用户和每个通行证条目的哈希值必须不同这一点。

我建议使用用户的注册日期(例如)作为盐。这样,对于每个用户和每个 pass,哈希算法都会有所不同(好的,如果两个用户具有相同的 pass 和相同的注册日期,它将是相同的)。

或者你可以使用用户 ID 作为盐,或者用户 ID 和 reg.date 和用户名之间的某种组合。

编辑: 您的方法实际上比使用没有盐的已知算法进行散列更好,但比散列+propper salt 差。

您所做的只是应用您自己的自定义哈希函数。在不知道自定义算法的情况下,这不容易被暴力破解,但对其他攻击很有效。

而且我建议不要在数据库中放置一个名为“SALT”的表,因为如果数据库被黑客入侵,攻击者将获得密码和它们的盐。

【讨论】:

  • 但是用户名是公开的,这不是问题吗?还是我也应该散列?
  • 据我所知,传统上,盐已存储在未加密的用户表中。它们只是为了增加尝试反转散列的复杂性。 This WP article 指的是“公共盐”,我认为这意味着可以从表中读取盐。
  • 可能不会,这取决于您打算做什么。如果 unames 被散列,您将无法告诉用户他的用户名是什么。在大多数情况下,用户名不是私人信息,应用程序会在页面上显示它们,允许其他用户查看它们等等。但是,有一种方法可以划分登录名和用户名 - 用户使用他的登录名登录(可以使用邮件)并以不同的名称向其他人展示自己。在这种情况下,登录名可以是私有的并且可以被散列。
  • 我的建议是使用 uId、uname、regdate 等的某种组合来构建盐。重要的是,您用于盐的字段不会随着时间而改变。这使得许多类型的攻击变得毫无意义,因为如果只有数据库被黑客攻击,攻击者就无法获得密码(他不知道哪些字段以及以什么组合用作盐)。如果攻击者仅查看构建盐的算法,但他无法查看数据库 - 他无法获得密码(这不太可能,因为如果他在大多数情况下获得对应用程序的访问权限,他也可以访问DB,正因为如此)。