Mar*_*sen 1 php passwords password-encryption
我有以下密码:
123
Run Code Online (Sandbox Code Playgroud)
现在我哈希,它返回以下键:
$2y$10$rSq.2M7Ikc.QPhVtYlp1Nu8HI.Eq5fUgVWn25J
Run Code Online (Sandbox Code Playgroud)
现在我尝试使用以下方法验证相同的密钥:
return password_verify(123, $2y$10$rSq.2M7Ikc.QPhVtYlp1Nu8HI.Eq5fUgVWn25J);
Run Code Online (Sandbox Code Playgroud)
但是这会返回false.
谁能告诉我为什么?
更新
这是我的完整代码:
<?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);
Run Code Online (Sandbox Code Playgroud)
我尝试插入以下字符串:
Helloworld
Run Code Online (Sandbox Code Playgroud)
然而$validate = false;
密码已返回 $2y$10$VbicsFaGN9d3ggQTNYIto.Bp6x/rbjpsBe2kneEhJ9oP2KdPsZ7hy
如果我尝试重新运行它,它返回相同的值,所以它们必须相互相等,所以为什么它返回false?!??!
也返回false
$validate = $this->getSecurity()->validate((string)$password, (string)$hash);
Run Code Online (Sandbox Code Playgroud)
对于您的第一个示例,密码为123,问题是您正在截断哈希值.
$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
Run Code Online (Sandbox Code Playgroud)
我假设您的数据库列的最大长度为45个字符,这就是它截断它的原因.
对于第二个字符串,问题是您将密码转换为小写的某个位置.
// 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
Run Code Online (Sandbox Code Playgroud)
因此,当您尝试使用Helloworld它时,它将返回false,因为哈希是为了helloworld.
你真的需要更加小心,因为这些都是粗心的错误.请注意,您不应将密码转换为特定情况(上限或下限),因为这会显着削弱它们.
| 归档时间: |
|
| 查看次数: |
3191 次 |
| 最近记录: |