3

我正在使用 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 表对象与这种加盐和散列策略一起使用?我环顾四周,但真的找不到 MD5 和 SHA 类型散列之外的任何解决方案......

4

3 回答 3

1

如果您将 Salt 存储在用户表中,您应该创建自己的适配器

如果您在其他地方有盐,您只需要加密密码,然后将其传递给适配器

$authAdapter->setCredential($cryptedPassword);

几周前我有同样的问题,我最终创建了自己的适配器,扩展 Zend_Auth_Adapter_DbTable

我实际上向后移植了 ZF2 Bcrypt 库,但您应该能够将它与 crypt 方法一起使用。

看看你是否想要AuthAdapter-DbTableBcrypt

于 2012-09-14T01:57:03.890 回答
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);
    }

  }
}

希望对某人有所帮助。

于 2012-09-14T03:05:22.330 回答
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));
于 2013-07-11T06:59:48.280 回答