Php Zend_认证设置认证处理
我正在使用Php Zend_认证设置认证处理,php,security,zend-framework,hash,zend-auth,Php,Security,Zend Framework,Hash,Zend Auth,我正在使用Zend_Auth和setCredentialTreatment设置哈希方法和salt。我看到所有的例子都是这样做的,salt似乎是作为文本插入的 ->setCredentialTreatment('SHA1(浓缩盐))' 但是我的salt存储在数据库中。我可以先检索它,然后在setCredentialTreatment中使用它,但是有没有一种方法可以直接将它定义为字段名,这样setCredentialTreatment就可以从该字段中获取它?有点像我们为用户名或密码定义字段名的方式
Zend_Auth
和setCredentialTreatment
设置哈希方法和salt。我看到所有的例子都是这样做的,salt
似乎是作为文本插入的
->setCredentialTreatment('SHA1(浓缩盐))'
但是我的salt存储在数据库中。我可以先检索它,然后在setCredentialTreatment
中使用它,但是有没有一种方法可以直接将它定义为字段名,这样setCredentialTreatment
就可以从该字段中获取它?有点像我们为用户名或密码定义字段名的方式
->setCredentialColumn('password')
我遇到的一个附带问题是,我希望使用SHA512而不是SHA1。这是可能的还是不可用?我看到的所有使用SHA1的示例
我应该说我是zend的新手,正在移植一个现有的应用程序,所以请简单回答。您可以编写自己的
zend\u Auth\u适配器
您给出的示例使用存储在数据库中的salt。只要salt存储在名为“salt”的字段中的每一行中,它就可以工作。如果它不在DB中,而是在PHP变量中,代码更像:
->setCredentialTreatment("SHA1(CONCAT(?, '$salt'))")
至于使用SHA512,这可能有点棘手。假设您使用的是MySQL,本例中的SHA1()是一个MySQL函数,据我所知,MySQL没有用于SHA512的函数,PHP也没有(编辑:关于后者,我错了,请参阅注释)。因此,您必须实现自己的PHP SHA512函数,首先从数据库中为用户加载salt,对结果进行散列,并且不对setCredentialTreatment中的变量执行任何操作
正如另一个答案所建议的,您可能需要为此编写自己的Zend_Auth_适配器。Auth适配器是一个处理身份验证的类,可能是在您使用Zend_Auth_Adapter_DbTable时。您可以在手册中找到有关Auth适配器的更多信息:
下面是一个例子:
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();
}
}
PHP通过散列扩展名提供了SHA512支持:散列('SHA512','some text to hash');实际上在原始PHP中我使用了
hash_hmac('SHA512')
,但定义一个新适配器并不是有点过分。定义一个新适配器需要多少行代码?我从链接页面上看不出来,因为他们正在截断代码。这是一个两步的过程,必须先加载salt,然后在PHP中进行哈希运算,这使得您的需求有点自定义。您可以扩展Zend_Auth_Adapter_DbTable,因此不需要太多代码。我用一个示例编辑了我的答案,让您开始学习-代码完全未经测试。用hash_hmac()代码替换$hash='';部分。