2014-01-14 2 views
5

Cake 2.4でBlowfishを使用する際のいくつかの基本的な質問に対する回答を見つけるのに苦労します。CakePHP - どのように私はブローフィッシュのパスワードをハッシングするのですか?

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):無効な塩:フグのためhttp://www.php.net/cryptを訪問し、フグ塩を構築するための適切なセクションをお読みください私は、ログインしようとする場合、私は次のエラーを取得しています。 [CORE/Cake/Utility/Security.php、line 285]

ログインを試みる前にパスワードを消去する必要がありますか?そうであれば、どの方法を使用するのですか。塩には何が最適です? Cakeは自動的にcore.php設定ファイルの塩をすべてのユーザーに使用しようとしていますか?

私は、CakePHPが自動的に標準のPHP方法で魚介類を使用する部分を知っていないので、私は混乱しています。

+0

この問題もあります。あなたはそれを解決しましたか? – Katelyn

答えて

9

他の方法でパスワードをハッシュしたデータベースが既にある場合は、Blowfishを使用することはできません。もしそうなら、それらは有効なBlowfishハッシュされたパスワードではなく、上のエラーが出ます。あなたが行ったようにあなたがコンポーネントの配列を設定http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html#using-bcrypt-for-passwords

::CakePHPアプリケーションでパスワードハッシュのためのフグを実装するという点で

は、クックブックは、認証に(フグ)bcryptのを使用して上に専用のセクションがあり

<?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()を使うとここでうまくいきます。 [here](http://www.dereuromark.de/2011/08/25/working-with-passwords-in-cakephp/)を参照してください。 – mark

+0

あなたの例では、ユーザが自分で登録することができないため、ユーザが自分で作成していないので、自分が所有するものには何も追加しません。ハッシュされたパスワードをデータベースにどのように保存する必要がありますか?どのデータ型/長さですか? – BadHorsie

+0

@mark確かに、 'User'レコードを取得して保存した場合、パスワードが結果セットに入った場合(つまり、' find( 'all') 'コールで)、パスワードがそれが存在していたからといって、再ハッシュしたので、 '!empty()'はそれをカットしませんでした。 –

1

私は同じ問題を持っているすべての人のための追加を持っています: blowfish-hashをVARCHAR(50)として保存しましたが、これは場合によっては短すぎます。これにより、ハッシュが間違っていたため、ログインできませんでした。適切な長さのフィールドを使用するようにしてください(Blowfishの場合は少なくともVARCHAR(123))。 Source

0

1.3.xから2.7.xにプロジェクトを移植しようとしたときに同様の問題が発生しました。私は完全なデータベース(同じプロセスでMySQLからPostgreSQLに移植されました)から始まりましたが、非常に空のCakePHPアプリケーションでした。 問題は、私のusersテーブルのハッシュされたパスワードがCakePHP 1.xから来たことでした。だからテーブルのハッシュはブローフィッシュの規則に従わなかった。このエラーメッセージが表示されます。ブローフィッシュハッシュは複雑なフォーマットに従います。ちなみに、同じ文字列の繰り返しハッシュは異なります。

ソリューション:

  1. 変更ユーザーテーブルのパスワード列をVARCHAR(128) (またはそれ以上)へ。
  2. 列を空にします。
  3. 最初の ログオンに有効なハッシュを生成します。

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

    非常に粗が、有効:

は後者を行うために、私はUsersController.phpに次の行を挿入します。今は同じプロジェクトで開発を続けるためにログオンすることができます。ログイン後、コードを削除してください。

関連する問題