我使用PHP crypt()在Zend php应用程序中散列我的密码。但是,我想不出与Zend_Auth_Adapter_DbTable一起使用此哈希的解决方案。假设我在使用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表对象与这种salting和散列策略一起使用?我环顾四周,但在MD5和SHA类型哈希之外找不到任何解决方案......
答案 0 :(得分:1)
如果要在用户表中存储Salt,则应创建自己的适配器
如果您在其他地方有盐,则只需加密密码,然后将其传递给适配器
$authAdapter->setCredential($cryptedPassword);
几个星期前我遇到了同样的问题,我最终创建了自己的适配器,扩展了Zend_Auth_Adapter_DbTable
我实际上向后移植了ZF2 Bcrypt lib,但你应该可以将它与crypt方法一起使用。
答案 1 :(得分: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);
}
}
}
希望能帮助某人。
答案 2 :(得分:0)
之前获取密码并将其用作crypt函数中的salt
$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));