2014-01-14 1 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]

로그인을 시도하기 전에 암호를 제거해야합니까? 그렇다면 어떤 방법을 사용해야하며 소금에 가장 적합한 것은 무엇입니까? ? 케이크가 모든 사용자에 대해 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 
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')); 
      } 
     } 
    } 
} 

그리고 그 모든있다 : 다음

<?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의 인증 핸들러가 당신을 위해 비교 암호를 할 것입니다 당신이 정말 아무것도 할 필요가 없습니다 인증하기 그것입니다.

나는이 같은 문제를 가진 모든 부가있어
+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

: 나는 어떤 경우에는 너무 짧은 VARCHAR (50)로 복어 해시를 저장. 이로 인해 해시가 잘못되어 로그인이 작동하지 않았습니다. 적절한 길이의 필드를 사용하십시오 (Blowfish는 적어도 VARCHAR (123) 이상). Source

0

프로젝트를 1.3.x에서 2.7.x로 이식하려고 할 때 비슷한 문제가 발생했습니다. 필자는 완전한 데이터베이스 (같은 프로세스에서 MySQL에서 PostgreSQL로 포팅)에서 시작했지만 매우 비어있는 CakePHP 애플리케이션으로 시작했습니다. 문제는 내 사용자 테이블의 해시 된 암호가 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에서 다음 줄을 삽입했다. 이제 같은 프로젝트에서 계속 개발하기 위해 로그온 할 수 있습니다. 로그인 할 수있게되면 코드를 제거하십시오.

관련 문제