2014-01-14 2 views
5

Борьба, чтобы найти ответы на несколько основных вопросов об использовании Blowfish в Cake 2.4.CakePHP - Как реализовать хеширование blowfish для паролей?

AppController.php

public $components = array(
    'Auth' => array(
     'authenticate' => array(
      'Form' => array(
       'fields' => array(
        'username' => 'email' 
       ), 
       'passwordHasher' => 'Blowfish' 
      ) 
     ) 
    ), 
    'Cookie', 
    'Session' 
); 

Что теперь? Как войти?

UsersController.php

public function login() { 

    if (!empty($this->request->data)) { 

     if ($this->Auth->login()) { 
      $this->redirect($this->Auth->redirectUrl()); 
     } 

    } 
} 

Что мне нужно сделать, чтобы добавить к этому? Я получаю следующее сообщение об ошибке при попытке войти в систему:

Предупреждение (512): Invalid соль: для Blowfish Пожалуйста, посетите http://www.php.net/crypt и прочитать соответствующий раздел для создания Blowfish солей. [CORE/Cake/Utility/Security.php, строка 285]

Нужно ли солить пароль перед попыткой входа в систему, и если да, то какой метод я использую и что лучше всего использовать для соли ? Cake автоматически пытается использовать соль из файла конфигурации core.php для всех пользователей?

Я смущен главным образом потому, что не знаю, какие части использования blowfish в стандартном PHP-способе CakePHP пытается сделать автоматически для меня.

+0

У меня тоже есть эта проблема. Вы когда-нибудь это решали? – Katelyn

ответ

9

Вы не можете использовать Blowfish, если у вас уже есть база данных, заполненная хэшами паролей с использованием другого метода. Если это так, они не будут действительными паролями Blowfish-hashed, и вы получите ошибку выше.

В плане реализации Blowfish для хэширования паролей в приложении CakePHP, Поваренная книга имеет специальный раздел по использованию Bcrypt (Blowfish) аутентификация: http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html#using-bcrypt-for-passwords

Вы создали массив компонентов, как вы сделали:

<?php 
class AppController { 

    public $components = array(
     'Auth' => array(
      'authenticate' => array(
       'Form' => array(
        'passwordHasher' => 'Blowfish' 
       ) 
      ) 
     ) 
    ); 
} 

Затем, чтобы сгенерировать пароль, вы должны использовать класс хэширования пароля в модели. Например, User модель:

<?php 
App::uses('BlowfishPasswordHasher', 'Controller/Component/Auth'); 

class User extends AppModel { 

    public function beforeSave($options = array()) { 
     // if ID is not set, we're inserting a new user as opposed to updating 
     if (!$this->id) { 
      $passwordHasher = new BlowfishPasswordHasher(); 
      $this->data[$this->alias]['password'] = $passwordHasher->hash($this->data[$this->alias]['password']); 
     } 
     return true; 
    } 
} 

Тогда для проверки подлинности вы на самом деле не нужно ничего делать, так как обработчик аутентификации CakePHP будет сделать пароль сравнения для вас:

<?php 
class UsersController extends AppController { 

    public function login() { 
     if ($this->request->is('post')) { 
      if ($this->Auth->login()) { 
       return $this->redirect($this->Auth->redirectUrl()); 
      } else { 
       $this->Session->setFlash(__('Username or password incorrect')); 
      } 
     } 
    } 
} 

И это все, что есть это ему.

+0

'if (! $ This-> id) {}' довольно нетрадиционный. Я бы не рекомендовал этот подход. особенно если вы также хотите предоставить пользователю возможность изменять свой пароль. Использование! Empty() лучше подходит здесь. См. [Здесь] (http://www.dereuromark.de/2011/08/25/working-with-passwords-in-cakephp/). – mark

+0

Ваш пример на самом деле ничего не добавляет к тому, что у меня есть, так как пользователи не могут зарегистрироваться, так что нет никакого создания пользователями. Как хранить хешированный пароль в базе данных? Какой тип данных/длина? – BadHorsie

+0

@mark Действительно, но у меня была проблема, когда, если бы я взял записи «User», а затем сохранил их, если пароль пришел в результирующий набор (т. Е. С помощью 'find ('all')' call), тогда пароль был re-hashed, только потому, что он присутствовал, поэтому '! empty()' не сократил его. –

1

У меня есть дополнение для всех с той же проблемой: Я сохранил blowfish-hash как VARCHAR (50), который в некоторых случаях слишком короткий. В результате этого мой логин не работал, потому что хэш был неправильным. Обязательно используйте поля, которые имеют достаточную длину (для Blowfish, по крайней мере, VARCHAR (123)). Source

0

У меня возникли аналогичные проблемы, когда я пытался перенести проект с 1.3.x на 2.7.x. Я начал с полной базы данных (портировал с MySQL на PostgreSQL в тот же процесс), но очень пустые приложения CakePHP. Проблема заключалась в том, что хешированные пароли в моей таблице пользователей пришли из CakePHP 1.x.Таким образом, хэши в таблице не соответствовали соглашениям Blowfish. Именно это вызывает сообщение об ошибке. Хеши Blowfish следуют усложненному формату. Кстати, повторяющиеся хэши одной строки будут разными.

Решение:

  1. Изменение столбца паролей в таблице пользователей к VARCHAR (128) (или более).
  2. Пустой столбец.
  3. Создать действительный хэш для первого вход в систему.

Для того, чтобы сделать последний, я вставил следующие строки в UsersController.php:

public function login() { 
    if ... 
    // code for getting a start password: 
    $passwordHasher = new BlowfishPasswordHasher(); 
    $mypasswd = $passwordHasher->hash('MyPasswordinClearText'); 
    debug($mypasswd); 
    // end inserted code 
    ... 
} 

Очень грубо, но эффективно. Теперь я могу войти в систему, чтобы продолжить разработку в том же проекте. Удалите код после входа в систему.

Смежные вопросы