によって作成されたpassword_hash()
ハッシュは、^password_verify()` を介して比較する必要があります。これは、同じパスワードの 2 つのハッシュが常に等しいとは限らないためです (少なくとも BCRYPT や ARGON2 ではそうではありません)。
<?php
$pass = 'foo';
var_dump(password_hash($pass, PASSWORD_BCRYPT) === password_hash($pass, PASSWORD_BCRYPT));
// bool(false)
var_dump(password_verify($pass, password_hash($pass, PASSWORD_BCRYPT)));
// bool(true)
誰か ( s7anley ) がZend_Auth_Adapter_DbTable
password_verify() を使用する拡張機能を作成しました。
<?php
class Base_Auth_Adapter_BcryptDbTable extends Zend_Auth_Adapter_DbTable
{
/**
* @inheritdoc
*/
protected function _authenticateCreateSelect()
{
$dbSelect = clone $this->getDbSelect();
$dbSelect->from($this->_tableName)
->where($this->_zendDb->quoteIdentifier($this->_identityColumn, true) . ' = ?', $this->_identity);
return $dbSelect;
}
/**
* @inheritdoc
*/
protected function _authenticateValidateResult($resultIdentity)
{
$passwordCheck = password_verify($this->_credential, $resultIdentity[$this->_credentialColumn]);
if (!$passwordCheck) {
$this->_authenticateResultInfo['code'] = Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID;
$this->_authenticateResultInfo['messages'][] = 'Supplied credential is invalid.';
return $this->_authenticateCreateAuthResult();
}
$this->_resultRow = $resultIdentity;
$this->_authenticateResultInfo['code'] = Zend_Auth_Result::SUCCESS;
$this->_authenticateResultInfo['messages'][] = 'Authentication successful.';
return $this->_authenticateCreateAuthResult();
}
}
クラス名には「Bcrypt」と書かれていますが、 でサポートされている任意のアルゴリズムで問題なく動作しpassword_hash()
ます。
次のように使用できます。
$authAdapter = new Base_Auth_Adapter_BcryptDbTable($databaseAdapter, 'users', 'login', 'password');
$authAdapter
->setIdentity('my_username')
->setCredential('my_password') // "clear" password
// ->setCredentialTreatment(null) // Can't set any treatment on password (would be ignored)
;
// For any additional filtering of returned rows, use getDbSelect()
$authAdapter->getDbSelect()->where('active = "TRUE"');