用CakePHP和河豚改变密码

Hof*_*off 4 cakephp blowfish bcrypt cakephp-2.0

我正在尝试设置一个表单,允许用户使用CakePHP 2.3更改密码.使用的算法是河豚.我有以下三个字段:

<?php echo $this->Form->input('old_password', array('type' => 'password', 'autocomplete' => 'off')); ?>
<?php echo $this->Form->input('new_password', array('type' => 'password', 'autocomplete' => 'off')); ?>
<?php echo $this->Form->input('new_password_confirm', array('type' => 'password', 'autocomplete' => 'off', 'label' => 'Confirm Password')); ?>
Run Code Online (Sandbox Code Playgroud)

这是我正在尝试验证他们正确输入旧密码的代码:

$hash = Security::hash($this->request->data['User']['old_password'], 'blowfish');
$correct = $this->User->find('first', array(
    'conditions' => array(
        'User.id' => AuthComponent::user('id'),
        'User.password' => $hash
    ),
    'fields' => array('id')
));
Run Code Online (Sandbox Code Playgroud)

问题是即使我正确输入旧密码,Cake也找不到用户,因为它似乎没有计算正确的哈希值.每次我使用相同的旧密码提交表单时,Cake每次都会生成一个不同的哈希值.这可能是由于我对blowfish/bcrypt算法的工作方式缺乏了解,但我似乎无法弄明白.

我在这里错过了什么?

dho*_*tet 16

使用河豚哈希与其他哈希类型不同.从哈希方法的API文档:

比较哈希:简单地将原始哈希密码作为盐传递.

这意味着在您的情况下,您首先必须检索特定用户的哈希密码,然后将其用作盐.就像是

$user = $this->User->find('first', array(
  'conditions' => array(
    'User.id' => AuthComponent::user('id')
  ),
  'fields' => array('password')
));
$storedHash = $user['User']['password'];
$newHash = Security::hash($this->request->data['User']['old_password'], 'blowfish', $storedHash);
$correct = $storedHash == $newHash;
Run Code Online (Sandbox Code Playgroud)