首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >password_hash和password_verify返回false

password_hash和password_verify返回false
EN

Stack Overflow用户
提问于 2014-01-10 00:57:53
回答 1查看 3.6K关注 0票数 1

我有以下密码:

代码语言:javascript
复制
123

现在我对其进行散列,它返回以下键:

代码语言:javascript
复制
$2y$10$rSq.2M7Ikc.QPhVtYlp1Nu8HI.Eq5fUgVWn25J

现在,我尝试使用以下方法验证相同的密钥:

代码语言:javascript
复制
return password_verify(123, $2y$10$rSq.2M7Ikc.QPhVtYlp1Nu8HI.Eq5fUgVWn25J);

但是,这将返回false。

有人能告诉我为什么吗?

更新

这是我的完整代码:

代码语言:javascript
复制
<?php
/**
 * Created by JetBrains PhpStorm.
 * User: Marc
 * Date: 14-12-13
 * Time: 13:56
 * To change this template use File | Settings | File Templates.
 */
class Security {
    /**
     * @param $string
     * @return mixed
     */
    public function encrypt($string) {
        return password_hash($string, PASSWORD_DEFAULT);
    }

    /**
     * @param $string
     * @param $hash
     * @return mixed
     */
    public function validate($string, $hash) {
        return password_verify($string, $hash);
    }
}

    $hash = $this->db->template("SELECT password FROM User WHERE username = '".$username."'", READ_FROM_QUERY)['password'];
$validate =  $this->getSecurity()->validate($password, $hash);

我尝试插入以下字符串:

代码语言:javascript
复制
Helloworld

$validate = false

密码返回给$2y$10$VbicsFaGN9d3ggQTNYIto.Bp6x/rbjpsBe2kneEhJ9oP2KdPsZ7hy

如果我尝试重新散列它,它返回相同的值soo,它们必须是相等的,所以为什么它返回false?!?!

返回false以及

代码语言:javascript
复制
$validate =  $this->getSecurity()->validate((string)$password, (string)$hash);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-10 04:33:39

对于第一个示例,密码为123,问题是您正在截断哈希。

代码语言:javascript
复制
$settings = array('cost' => 10, 'salt' => 'rSq.2M7Ikc.QPhVtYlp1Nu');                                        
echo password_hash('123', PASSWORD_BCRYPT, $settings);
// $2y$10$rSq.2M7Ikc.QPhVtYlp1Nu8HI.Eq5fUgVWn25J/WWUma/RrNWKFay // What is echoed
// $2y$10$rSq.2M7Ikc.QPhVtYlp1Nu8HI.Eq5fUgVWn25J                // Your hash

我假设您的数据库colum最大长度为45个字符,这就是它截断它的原因。

对于第二个字符串,问题是在行的某个地方,您正在将密码转换为小写。

代码语言:javascript
复制
// Uppercase 'H'
$settings = array('cost' => 10, 'salt' => 'VbicsFaGN9d3ggQTNYIto.');
echo password_hash('Helloworld', PASSWORD_BCRYPT, $settings);
// $2y$10$VbicsFaGN9d3ggQTNYIto.qFAer7kUmKmcy6y9RCNzaaKD7fJraba

// Lowercase 'h'
$settings = array('cost' => 10, 'salt' => 'VbicsFaGN9d3ggQTNYIto.');
echo password_hash('helloworld', PASSWORD_BCRYPT, $settings);
// $2y$10$VbicsFaGN9d3ggQTNYIto.Bp6x/rbjpsBe2kneEhJ9oP2KdPsZ7hy

因此,当您尝试使用Helloworld进行验证时,它将返回false,因为散列用于helloworld

你真的需要更加小心,因为这两个都是非常粗心的错误。请注意,您不应该将密码转换为特定的情况(上或下),因为这会大大削弱密码。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21034357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档