Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Zend_认证设置认证处理_Php_Security_Zend Framework_Hash_Zend Auth - Fatal编程技术网

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='';部分。