Zend_Auth setCredentialTreatment

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

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

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

->setCredentialColumn('password')

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

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

2 ответа

Решение

В приведенном вами примере используется соль, хранящаяся в базе данных. Это будет работать до тех пор, пока соль хранится в каждой строке в поле, называемом "соль". Если бы соль была не в БД, а в переменной 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();
    }
}

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

Другие вопросы по тегам