双密码_hash php

时间:2016-08-03 20:12:05

标签: php hash

我想知道在我的网站上为我的用户密码使用password_hash两次是否可行/明智。

所以,让我们这样说:

  • 用户在我的网站上注册,他们输入密码,我们会打电话给你 input

  • 在创建帐户期间,他们的密码为$firstHash = password_hash($input, PASSWORD_BCRYPT)(例如,我们可以说 这个散列到" thisFirstHash"

  • 对密码进行哈希处理后,会再次对其进行哈希$firstHash = password_hash($firstHash, PASSWORD_BCRYPT)(例如,让我们 比如说这个哈希来自" thisSecondHash")

  • 第二个哈希是存储在数据库中的内容,所以现在就是它们 登录后,服务器必须解密散列哈希。

  • 当用户登录时,他们再次输入密码,我们将再次输入 请拨打此input

  • 然后服务器必须重新加密输入以与保存的数据进行比较 哈希$loginHash1 = password_hash($input, PASSWORD_BCRYPT)

  • 服务器将新的loginHash1变量与保存的变量进行比较 哈希password_verify($loginHash1,"thisSecondHash")

  • 如果第一个哈希匹配,则比较第二个哈希

  • password_verify($input,"thisFirstHash")

我无法在我的小测试环境中正常工作,我怀疑它与登录阶段的随机盐在重新输入输入时有所不同。

所以我的问题是,

  1. 可以这样做吗?
  2. 这样做有益吗?

2 个答案:

答案 0 :(得分:2)

password_hash()函数已经重复对密码进行哈希处理,这称为密钥拉伸,可以使蛮力攻击更加困难。因此,使用BCrypt两次没有意义。

它在你的情况下不起作用的原因是因为password_hash()添加了一个随机盐,它成为生成的哈希的一部分。这个盐是验证密码所必需的,但是通过调用该函数两次,你就会丢失第一个盐。

答案 1 :(得分:1)

密码散列API的重点是使实现安全散列变得简单。尽可能增加复杂性不会增加任何安全性,并且会使您的代码更难以调试。使用一个password_hash和一个password_verify。 PHP的PASSWORD_DEFAULT已被选为非常强大的:

哈希

$hash = password_hash($cleartext, PASSWORD_DEFAULT)

验证

$isCorrect = password_verify($cleartext, $hash);

如果您对PHP非常强大的默认设置不满意,可以查看cost设置。但它真的不需要。 The docs say

  

password_hash()使用强哈希,生成强盐,和   自动应用适当的回合。 password_hash()很简单   crypt()包装器并与现有密码哈希兼容。用于   鼓励使用password_hash()。