我正在使用Zend_Auth
和setCredentialTreatment
来设置哈希方法和salt。我看到所有示例都是这样的,其中salt
似乎是作为文本插入的。
- > setCredentialTreatment( '?SHA1(CONCAT(盐))'
但我的盐存储在数据库中。我可以先检索它然后在setCredentialTreatment
中使用它,但有没有办法可以直接将其定义为字段名称,因此setCredentialTreatment
会知道从该字段中获取它?有点像我们为用户名或密码定义字段名称的方式
->setCredentialColumn('password')
我遇到的一个问题是我想使用SHA512而不是SHA1。这可能还是不可用?我看到的所有示例都使用SHA1。
我应该说我是一个相当新的zend并且正在移植一个现有的应用程序,所以请轻松地告诉我答案。
答案 0 :(得分:8)
您给出的示例确实使用了存储在数据库中的salt。只要盐存储在名为“盐”的字段中的每一行中,它就会起作用。如果盐不在DB中,而在PHP变量中,则代码更像是:
->setCredentialTreatment("SHA1(CONCAT(?, '$salt'))")
至于使用SHA512,这可能有点棘手。假设你正在使用MySQL,在这种情况下SHA1()是一个MySQL函数,据我所知,MySQL没有SHA512的函数,PHP也没有(编辑:我错了后者,请参阅注释)。因此,您必须实现自己的PHP SHA512函数,首先从数据库中加载用户的salt,对结果进行散列,而不对setCredentialTreatment中的变量执行任何操作。
正如另一个答案建议你可能想为此编写自己的Zend_Auth_Adapter。 auth适配器是一个处理身份验证的类,可能是在您使用Zend_Auth_Adapter_DbTable时。您可以在手册中找到有关auth适配器的更多信息:http://framework.zend.com/manual/en/zend.auth.introduction.html
以下是一个例子:
class My_Auth_Adapter extends Zend_Auth_Adapter_DbTable
{
public function authenticate()
{
// load salt for the given identity
$salt = $this->_zendDb->fetchOne("SELECT salt FROM {$this->_tableName} WHERE {$this->_identityColumn} = ?", $this->_identity);
if (!$salt) {
// return 'identity not found' error
return new Zend_Auth_Result(Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND, $this->_identity);
}
// create the hash using the password and salt
$hash = ''; // SET THE PASSWORD HASH HERE USING $this->_credential and $salt
// replace credential with new hash
$this->_credential = $hash;
// Zend_Auth_Adapter_DbTable can do the rest now
return parent::authenticate();
}
}
答案 1 :(得分:2)
您可以自己编写Zend_Auth_Adapter
。