2011-07-15 10 views
6

Pracuję nad web administration module for mailservers (to open source, jeśli chcesz rzucić okiem).Jak bezpiecznie generować hasze SSHA256 lub SSHA512 w PHP?

W tym celu muszę mieć możliwość generowania hashowanego hasła, które będzie można odczytać przez Dovecot. Jako described on their wiki, ich zalecany schemat mieszania haseł to SSHA256 (dodatkowa S jest przeznaczona do solenia).

To również wyjaśnia, że ​​może to być w miarę proste do wykonania czegoś podobnego tego kodu PHP:

$salt = 'generate_a_salt_somehow'; 
$hash = hash('sha256', $password . $salt); 

Jednak z tego co czytałem na temat kryptografii, że jest dość naiwny sposób, aby wygenerować solone mieszań , ale jeśli robisz to źle, gdy typing A-E-S in your source code, pomyślałem, że to samo może być prawdą w tym przypadku.

Więc jeśli masz wgląd w kryptografię, chciałbym usłyszeć o najbezpieczniejszym sposobie na to, czy to mcrypt, mhash czy cokolwiek innego.

+0

O tak, bezpieczny sposób na przygotowanie skrótu również byłby dobry :) – mikl

+0

http://php.net/manual/en/function.ha sh-hmac.php –

+0

Czy skrót musi pasować do innych implementacji? Czy akceptowalna jest unikalność witryny? – wallyk

Odpowiedz

8

Strona wiki Dovecot, którą połączyłeś wyjaśnia, jaki jest dokładny format hash Dovecot. Nie masz wyboru - Dovecot ma swoje oczekiwania co do wyglądu skrótu, więc musisz grać według jego zasad:

Dla większości solonych systemów haseł (SMD5, SSHA *) sól jest przechowywana po skrócie hasła, a jej długość może być różna. Podczas mieszania hasła należy dołączyć sól po hasle jawnego tekstu, np .: SSHA256 (podanie, sól) = SHA256 (podanie + sól) + sól.

Więc funkcja odpowiednie hasło w PHP pokolenie może wyglądać następująco:

$hash = "{SSHA256}" . base64_encode(hash('sha256', $password . $salt) . $salt); 
+2

Początkowo nie mogłem tego uruchomić, ale jak się okazało, musiałem ustawić trzeci parametr '$ raw_output' na wartość skrótu(), aby działał, ponieważ w przeciwnym razie kodowanie base64 już zakodowana w hexach. W przeciwnym razie, dzięki za cynk :) – mikl

5

Hasło funkcję generacji w PHP:

$hash = "{SSHA256}".base64_encode(hash('sha256', $password.$salt, true).$salt); 

niekoniecznie "prawdziwej" - trzeci parametr ...

+0

Nie mam absolutnie żadnego pojęcia, dlaczego twój nie jest oznaczony jako poprawna odpowiedź. Dokładnie to jest wymagane do działania. – Josh

Powiązane problemy