【问题标题】:Retrieve password after hashing with random salt BCript使用随机盐 BCrypt 散列后检索密码
【发布时间】:2014-02-28 16:01:40
【问题描述】:

在用随机盐对密码进行哈希处理后,我无法找到任何验证密码的方法:

    public function hashPassword($password){
        $options = [
            'cost' => 11,
            'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM),
        ];
        return password_hash($password, PASSWORD_BCRYPT, $options);
    }

以及要检索的代码:

    public function validatePassword($password){
        return password_verify($this->password, self::model()->password);
    }

但它似乎不起作用,也许有人可以告诉我为什么?

【问题讨论】:

    标签: php hash yii passwords


    【解决方案1】:

    您实际上并未在 validatePassword 函数中使用 $password 参数。注意:$password 应该是输入的纯文本密码,第二个参数应该包含您之前存储的哈希版本。试试这个:

    public function validatePassword($password){
        return password_verify($password, self::model()->password);
    }
    

    另外,最好不要自己处理盐渍。只需使用PASSWORD_DEFAULT 选项,不要加盐。 PHP 将处理它。您可以使用password_needs_rehash() 来检查如果PHP 版本升级更改了默认密码,是否需要重新哈希密码。

    【讨论】:

      【解决方案2】:

      以完全相同的方式再次对其进行哈希处理并比较两个字符串。这是大多数密码的比较方式。

      【讨论】:

      • 请注意,您必须保存为每个密码生成的盐,以便在比较时能够使用相同的盐(这或对所有密码使用唯一的盐,如果保密的话就足够安全了)
      • 没错,关键是永远不要存储实际密码,以防出现安全漏洞。
      • 所以这意味着我必须保存盐。. 那么使用包含每个用户的用户 ID 和盐的盐表是一种安全的做法吗?
      • 我通常为整个应用程序定义 1 个盐。盐的主要原因是为了防止彩虹表。整个应用程序有 1 个盐(使其成为大盐)就足够了。您还可以使用用户表中的单个盐,一个永远不会更改的字段,例如 id(可能太低),或加入日期的时间戳。