我想知道在我的网站上为我的用户密码使用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")
我无法在我的小测试环境中正常工作,我怀疑它与登录阶段的随机盐在重新输入输入时有所不同。
所以我的问题是,
答案 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()。