2010-09-16 8 views
8

Używam Zend_Auth z setCredentialTreatment do ustawienia metody hash i soli. Widzę wszystkie przykłady robi coś takiego, gdzie salt wydaje się być wstawiony jako tekst.Zend_Auth setCredentialTreatment

-.> SetCredentialTreatment ('? SHA1 (CONCAT (sól))'

ale moja sól są przechowywane w bazie danych mogę je odzyskać pierwszy następnie używać go w setCredentialTreatment ale jest tam sposób mogę ją określić bezpośrednio jako nazwa pola, więc setCredentialTreatment wiedziałby, aby ją od tej dziedzinie? coś w rodzaju sposób definiujemy nazwę pola dla nazwy użytkownika lub hasła

->setCredentialColumn('password') 

boczna emisyjnej jestem jest to, że chciałbym użyć SHA512 nie SHA1. Czy to możliwe, czy nie jest dostępne? Wszystkie przykłady, które widzę, używają SHA1.

Powinienem powiedzieć, że jestem całkiem nowy, by zendować i przesyłam istniejącą aplikację, więc proszę, nie krępuj się z odpowiedziami.

Odpowiedz

8

Podany przez ciebie przykład wykorzystuje sól przechowywaną w bazie danych. Będzie działać tak długo, jak długo sól będzie przechowywana w każdym rzędzie w polu zwanym "solą". Jeśli sól nie był w PB i w zmiennej PHP zamiast kod byłoby coś więcej takich jak:

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

Jak za korzystanie SHA512, to może być trochę trudniejsze. Zakładając, że używasz MySQL, SHA1() w tym przypadku jest funkcją MySQL, a MySQL nie ma funkcji dla SHA512, o ile wiem, i nie ma PHP (edytuj: myliłem się co do tego drugiego, zobacz komentarze). Musisz więc zaimplementować swoją własną funkcję PHP SHA512, najpierw załadować sól dla użytkownika z DB, zaszyfrować wynik i nic nie zrobić dla zmiennej w setCredentialTreatment.

Jak sugerowała inna odpowiedź, możesz napisać własny Zend_Auth_Adapter. Auth adapter to klasa, która obsługuje uwierzytelnianie, prawdopodobnie w momencie, gdy używasz Zend_Auth_Adapter_DbTable. można znaleźć więcej informacji na temat auth adapterów w instrukcji: http://framework.zend.com/manual/en/zend.auth.introduction.html

Oto przykład:

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 ma wsparcia SHA512 poprzez rozszerzenie skrótu: hash ('sha512', 'jakiś tekst hash') ; –

+0

Właściwie w oryginalnym PHP używam 'hash_hmac ('sha512')', ale nie definiuję nowej karty trochę przesady dla tego. Ile linii kodu definiuje nowy adapter? Nie mogłem powiedzieć z połączonej strony, ponieważ obcinają kod. – jblue

+0

Jest to dwustopniowy proces polegający na tym, że najpierw trzeba załadować sól, aby wykonać mieszanie w PHP, co sprawia, że ​​twoje wymagania są trochę niestandardowe. Możesz rozszerzyć Zend_Auth_Adapter_DbTable, więc nie trzeba wiele kodu. Edytowałem swoją odpowiedź na przykładzie, aby zacząć grę - kod jest całkowicie nieprzetestowany. Zamień $ hash = ''; część z kodem hash_hmac(). –

2

Możesz napisać własną wersję Zend_Auth_Adapter.