【问题标题】:Zend\Crypt\Password\BCrypt verify methodZend\Crypt\Password\BCrypt 验证方法
【发布时间】:2015-09-22 12:57:05
【问题描述】:

我正在使用Zend\Crypt\Password\Bcrypt 在数据库中存储加密的密码。不过现在仔细看了一下好像没看懂the verify method of this class

/**
 * Verify if a password is correct against a hash value
 *
 * @param  string $password
 * @param  string $hash
 * @throws Exception\RuntimeException when the hash is unable to be processed
 * @return bool
 */
public function verify($password, $hash)
{
    $result = crypt($password, $hash);
    return Utils::compareStrings($hash, $result);
}

根据评论的功能“验证密码是否针对哈希值正确”

但是当我检查the php crypt function 时,它调用的第二个参数是一个可选的$salt,而不是一个$hash 要验证的字符串。

我的阅读方式:它首先使用传递的$hash 作为盐来加密我们要检查的$password,然后将它用作盐的相同$hash 与加密的$result 进行比较! ?

那么我在这里错过了什么? php-doc 不正确,或者我不明白发生了什么,或者我错过了文档中的某些内容。

【问题讨论】:

  • 看到 Bcrypt 不应该通过比较 2 个字符串而是使用 password_verify() 来验证,这有点奇怪。我也想对此进行解释
  • @Crecket Zend\Crypt\Password\Bcrypt 是在将 password_* 函数添加到 PHP 核心之前创建的。

标签: php zend-framework2 bcrypt password-encryption


【解决方案1】:

Bcrypt 哈希具有良好记录的结构,例如这个哈希:

$2y$10$aPk2mEEIkGonq6/JGr0OKOhYOdgomu61ARBjDLgb0UmHM4L8f7Hxe

字符串$2y$ 是前缀,10 是成本,aPk2mEEIkGonq6/JGr0OKO 是盐(128 位,base64 编码的 22 个字符),hYOdgomu61ARBjDLgb0UmHM4L8f7Hxe 是结果哈希。

crypt 函数识别这种格式并使用它的适当部分作为盐,因此将整个哈希作为第二个参数传递是没有问题的。

【讨论】:

  • 感谢您的回答。显然这不是问题,但非常令人困惑,我猜不仅对我来说。我认为他们应该更新文档并解释第二个参数可以是盐或哈希。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 2013-12-21
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多