2012-09-14 41 views
3

我使用PHP crypt()在Zend php應用程序中散列我的密碼。然而,我想不出一個使用Zend_Auth_Adapter_DbTable的散列解決方案。假設我正在用的crypt()後運行一個存儲密碼哈希...Zend_Auth_Adapter_DbTable和PHP crypt

//Salt and hash... 
    $salt = '$2a$07$'.$this->getSalt(); 
    $data['password'] = crypt($user_object->password, $salt); 
    $this->_db_table->insert($data); 

    //Authentication... 
    $dbAdapter = Zend_Db_Table::getDefaultAdapter(); 
    $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter); 
    $authAdapter->setTableName('users') 
       ->setIdentityColumn('username') 
       ->setCredentialColumn('password') 
       //Now what? Possibly... 
       ->setCredentialTreatment(/* But how? */); 

我如何使用Zend_Auth_Adapter_DbTable表對象用這種鹽析和哈希策略?我環顧四周,但真的不能找到MD5和SHA哈希類型以外的任何解決方案...

回答

1

如果要存儲鹽在user表中,你應該創建自己的適配器

如果你有鹽別的地方,你只需要對密碼進行加密,然後只將它傳遞給適配器

$authAdapter->setCredential($cryptedPassword); 

我有同樣的問題在幾個星期前,我結束了創建我自己的適配器,擴展Zend_Auth_Adapter_DbTable

我其實backport的ZF2 Bcrypt庫,但你應該能夠使用crypt方法。

如果你想AuthAdapter-DbTableBcrypt

+1

我相信$ authAdapter-> setCredential($ cryptedPassword)將無法工作作爲哈希實際上看起來不同,每次,這是一個crypt與MD5的優勢。你實際上必須讓適配器使用crypt函數來運行算法,並確定它們都是jive ......我已經寫完了自己的適配器,將它發佈。 – bristophocles

+0

讓我改正自己,與MD5相比,優點是不會將密碼存儲在表中。這種方法將打敗這種優勢。 – bristophocles

1

所以我寫了我自己的適配器來克服這個看看。只是包括文件,其傳遞到與細節(在這裏我使用的電子郵件和密碼登錄)一Zend_Auth的適配器身份驗證功能:

class User_Authenticate_Adapter implements Zend_Auth_Adapter_Interface { 
    protected $_username; 
    protected $_password; 

    public function __construct($email, $password) { 
    $this->_email = $email; 
    $this->_password = $password; 
    } 
    public function authenticate() { 

    $dbTable = new Application_Model_DbTable_User(); 
    $select = $dbTable->select()->where('email = ?', $this->_email); 
    $row = $dbTable->fetchRow($select); 

    if($row == null) { 
     return new Zend_Auth_Result(Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND,$this->_email); 
    } 
    $data = $row->toArray(); 
    if(!crypt($data['password'], $this->_password)) { 
     return new Zend_Auth_Result(Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID,$this->_email); 
    } 
    else { 
     return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS); 
    } 

    } 
} 

希望幫助別人。

+0

您可以刪除用戶名和密碼屬性。只需使用'$ select = $ dbTable-> select() - > where($ this - > _ identityColumn。'=?',$ this - > _ identity);' – traditional

0

才把密碼,並用它作爲crypt函數鹽

$dbUser = new Application_Model_DbTable_User; 
$data = $dbUser->fetchRow(array("username = ?" => $_POST["username"])); 
$cryptedPassword = $data->password; // here is the salt 

$authAdapter->setIdentity($_POST["username"]) 
      ->setCredential(crypt($_POST["password"], $cryptedPassword));