Zend_Auth setCredentialTreatment

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

->setCredentialTreatment('SHA1(CONCAT(?,соль))'

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

->setCredentialColumn('password')

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

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


person jblue    schedule 16.09.2010    source источник


Ответы (2)


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

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

Что касается использования SHA512, это может быть немного сложнее. Предполагая, что вы используете MySQL, SHA1() в этом случае является функцией MySQL, и, насколько я могу судить, MySQL не имеет функции для SHA512, как и PHP (отредактируйте: я ошибался в последнем, см. комментарии ). Таким образом, вам придется реализовать свою собственную функцию 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();
    }
}
person Tim Fountain    schedule 16.09.2010
comment
PHP поддерживает SHA512 через расширение hash: hash('sha512', 'некоторый текст для хеширования'); - person Ryan Chouinard; 16.09.2010
comment
На самом деле в оригинальном PHP я использую hash_hmac('sha512'), но не определяю новый адаптер для этого. Сколько строк кода будет определять новый адаптер? Я не мог сказать по связанной странице, потому что они усекают код. - person jblue; 16.09.2010
comment
Это двухэтапный процесс: сначала нужно загрузить соль, чтобы выполнить хеширование в PHP, что делает ваше требование немного индивидуальным. Вы можете расширить Zend_Auth_Adapter_DbTable, поэтому не потребуется много кода. Я отредактировал свой ответ с примером, чтобы вы начали - код полностью не проверен. Замените $hash = ''; часть с вашим кодом hash_hmac(). - person Tim Fountain; 16.09.2010

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

person Alex Pliutau    schedule 16.09.2010