Zend_Auth_Adapter_DbTable and PHP crypt

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类型的哈希之外,实在找不到其他解决方案...

3个回答

1
如果您将Salt存储在用户表中,您应该创建自己的适配器。
如果您在其他地方有Salt,则只需加密密码,然后将其传递给适配器即可。
$authAdapter->setCredential($cryptedPassword);

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

实际上,我回溯了ZF2 Bcrypt库,但你应该能够使用crypt方法。

如果你想要的话,可以看一下AuthAdapter-DbTableBcrypt


1
我相信 $authAdapter->setCredential($cryptedPassword) 不会起作用,因为哈希值实际上每次都会不同,这是 crypt 与 MD5 的一个优点。你实际上必须让适配器使用 crypt 函数来运行算法并确定它们是否匹配... 我最终编写了自己的适配器,将在此发布。 - bristophocles
让我改正一下,与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);
    }

  }
}

希望这能帮助到某些人。

你可以移除用户名和密码属性。只需使用 $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));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接