2010-09-16 2 views
8

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

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

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

->setCredentialColumn('password') 

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

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

ответ

8

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

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

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

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

PHP поддерживает SHA512 через расширение хеш: хэш («SHA512», «некоторый текст хэш») ; –

+0

На самом деле в исходном PHP я использую 'hash_hmac ('sha512')', но не определяет новый адаптер, немного перегруженный для этого. Сколько строк кода будет определять новый адаптер? Я не могу сказать со страницы, потому что они обрезают код. – jblue

+0

Это двухэтапный процесс загрузки соли сначала для хэширования на PHP, что делает ваше требование немного обычным. Вы можете расширить Zend_Auth_Adapter_DbTable, чтобы не требовалось много кода. Я отредактировал свой ответ с примером, чтобы вы начали - код полностью не тестировался. Заменить $ hash = ''; часть с вашим кодом hash_hmac(). –

2

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