Zend_Auth setCredentialTreatment - PullRequest
       3

Zend_Auth setCredentialTreatment

8 голосов
/ 16 сентября 2010

Я использую Zend_Auth с setCredentialTreatment, чтобы установить метод хеширования и соль.Я вижу, что все примеры делают что-то вроде этого, где salt кажется вставленным в виде текста.

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

но моя соль хранится в базе данных. Я мог бы сначала извлечь ее, а затем использовать в setCredentialTreatment, но есть ли способ, которым я мог бы определить ее непосредственно как имя поля, чтобы setCredentialTreatment знал, чтобы получить ееиз того поля? вроде как мы определяем имя поля для имени пользователя или пароля

->setCredentialColumn('password')

Побочная проблема, с которой я столкнулся, заключается в том, что я хотел бы использовать SHA512, а не SHA1. Возможно ли это?или он недоступен? Все примеры, которые я вижу с помощью SHA1.

Я должен сказать, что я довольно новичок в Zend и портирую существующее приложение, поэтому, пожалуйста, ответьте мне спокойно.

Ответы [ 2 ]

8 голосов
/ 16 сентября 2010

В приведенном вами примере используется соль, хранящаяся в базе данных.Это будет работать до тех пор, пока соль хранится в каждом ряду в поле под названием «соль».Если бы соль была не в БД, а в переменной PHP, код был бы чем-то вроде:

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

Что касается использования SHA512, это может быть немного сложнее.Предполагая, что вы используете MySQL, SHA1 () в этом случае является функцией MySQL, и, насколько я могу судить, MySQL не имеет функции для SHA512, как и PHP (edit: я был неправ по поводу последнего, смотрите комментарии).Поэтому вам придется реализовать свою собственную функцию PHP SHA512, сначала загрузить соль для пользователя из БД, хэшировать результат и ничего не делать с переменной в setCredentialTreatment.

Как подсказывает другой ответВозможно, вы захотите написать свой собственный Zend_Auth_Adapter для этого.Аутентификационный адаптер - это класс, который обрабатывает аутентификацию, предположительно в тот момент, когда вы используете 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();
    }
}
2 голосов
/ 16 сентября 2010

Вы можете написать свой собственный Zend_Auth_Adapter.

...