2016-08-03 55 views
0

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

因此,让我们这样说:

  • 在我的网站用户注册,他们输入密码,我们将调用这个 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. 这样做有益吗?
+8

请不要__roll你自己的密码散列。 PHP提供['password_hash()'](http://php.net/manual/en/function.password-hash.php) 和['password_verify()'](http://php.net/manual/) en/function.password-verify.php)请使用它们,我可能想使用你的网站有一天 这里有一些[关于密码的好主意](https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet ) 如果您使用5.5以前的PHP版本[此处提供了兼容包](https://github.com/ircmaxell/password_compat) – RiggsFolly

+8

否 - 这不明智,并且不会增加安全性。 –

+0

也许如果你把第一个散列结果反过来,然后用base64对它进行编码,然后散列那个....记住任意数量的步骤是安全性的关键 – Ray

回答

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()。

2

password_hash()函数已经重复散列密码,这被称为密钥拉伸,并且这样做使得暴力攻击更加困难。所以使用BCrypt没有意义。

它在你的情况下不起作用的原因是因为password_hash()添加了一个随机盐,它成为结果散列的一部分。这种盐对验证密码是必要的,但是在调用函数两次时,你会丢失第一个盐。