php - Zend_Auth setCredentialTreatment

标签 php security zend-framework hash zend-auth

我使用 Zend_AuthsetCredentialTreatment 来设置散列方法和盐。我看到所有示例都在做类似的事情,其中​​ salt 似乎作为文本插入。

->setCredentialTreatment('SHA1(CONCAT(?,salt))'

但我的盐存储在数据库中。我可以先检索它,然后在 setCredentialTreatment 中使用它,但是有没有一种方法可以将它直接定义为字段名称,这样 setCredentialTreatment 就知道从该字段中获取它?有点像我们为用户名或密码定义字段名的方式

->setCredentialColumn('password')

我遇到的一个附带问题是我想使用 SHA512 而不是 SHA1。这可能还是不可用?我看到的所有示例都使用 SHA1。

我应该说我是 zend 的新手并且正在移植一个现有的应用程序,所以请对我的回答从容不迫。

最佳答案

您给出的示例确实使用了存储在数据库中的盐。只要盐存储在名为“salt”的字段中的每一行中,它就会起作用。如果盐不在数据库中而是在 PHP 变量中,代码将更像是:

->setCredentialTreatment("SHA1(CONCAT(?, '$salt'))")

至于使用 SHA512,这可能有点棘手。假设您使用的是 MySQL,在这种情况下 SHA1() 是一个 MySQL 函数,据我所知,MySQL 没有 SHA512 函数,PHP 也没有(编辑:我对后者的看法是错误的,请参阅评论).因此,您必须实现自己的 PHP SHA512 函数,首先将用户的盐从数据库中加载出来,对结果进行哈希处理,并且不对 setCredentialTreatment 中的变量执行任何操作。

正如其他答案所建议的那样,您可能想为此编写自己的 Zend_Auth_Adapter。 auth 适配器是一个处理身份验证的类,大概在您使用 Zend_Auth_Adapter_DbTable 的那一刻。您可以在手册中找到有关身份验证适配器的更多信息: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();
    }
}

关于php - Zend_Auth setCredentialTreatment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3725873/

相关文章:

php - 如何在 json 中传递变量数组并检索它

php - 我的表单数据不会发布到我的 phpmyadmin 数据库中

php - 当精确匹配可用时对 MySQL 表执行部分搜索

security - Windows 7 上的 Firefox 出现奇怪的安全错误

java - 如何安全地存储外部服务的凭据

spring - 对于使用过 Spring 框架的人来说,哪个 PHP 框架会更容易使用?

使用 Zend Framework 进行 JQuery UI 自动完成

javascript - 从多个文本框存储数据

php - 使用函数参数动态生成查询

security - 源安全组在 AWS 中未按预期工作