2011-01-13 14 views
10

Zgodnie z crypt() documentation, sól musi mieć 22 podstawowe 64 cyfry z alfabetu "./0-9A-Za-z".Blowfish długość soli dla funkcji Crypt()?

To jest przykładowy kod dają:

crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$'); 

Pierwszy mylące jest to, że sól ma 25 znaków, a nie 22.

Pytanie # 1: Czy to znaczy sól ma być dłużej niż niż 22 znaki?

Potem sam testowałem funkcję i zauważyłem coś. Jeśli używam soli 20 znaków, otrzymuję ten

// using 20 char salt: 00000000001111111111 
crypt('rasmuslerdorf', '$2a$07$00000000001111111111$'); 
// $2a$07$00000000001111111111$.6Th1f3O1SYpWaEUfdz7ieidkQOkGKh2 

Więc kiedy stosować sól 20 znaków, cała sól jest na wyjściu. Co jest wygodne, ponieważ nie muszę przechowywać soli w oddzielnym miejscu. (Chcę użyć losowych soli). Byłbym w stanie odczytać sól z wygenerowanego hasha.

Jednakże, jeśli używam soli 22-znakowej, jak mówi dokumentacja, lub dłuższej, sól jest odcięta na końcu.

// using 22 char salt: 0000000000111111111122 
crypt('rasmuslerdorf', '$2a$07$0000000000111111111122$'); 
// $2a$07$000000000011111111112uRTfyYkWmPPMWDRM/cUAlulrBkhVGlui 
// 22nd character of the salt is gone 

// using 25 char salt: 0000000000111111111122222 
crypt('rasmuslerdorf', '$2a$07$0000000000111111111122222$'); 
// $2a$07$000000000011111111112uRTfyYkWmPPMWDRM/cUAlulrBkhVGlui 
// Same hash was generated as before, 21 chars of the salt are in the hash 

Pytanie # 2: Więc, co dokładnie jest właściwa długość soli? 20? 22? Dłużej?

Pytanie # 3: Czy warto czytać sól z hasha, gdy trzeba sprawdzić hasła? Zamiast przechowywać sól w oddzielnym polu i czytać ją stamtąd. (Co wydaje się zbędne, ponieważ sól wydaje się być zawarta w hashu).

Odpowiedz

8

Sole Blowfish powinny mieć długość 22 znaków (łącznie z końcem $, więc 21) - możesz dwukrotnie sprawdzić z var_dump(CRYPT_SALT_LENGTH), Nie mogę tego teraz zweryfikować, ale domyślam się, że mniej znaków zwróci błąd i więcej znaków będzie być obcięte.

Odnośnie trzeciego pytania: tak, powinieneś przeczytać i sprawdzić hasz używając wbudowanych parametrów soli (i kosztów) z samego skrótu.

+1

CRYPT_SALT_LENGTH zwraca 60 na moim komputerze Win7, 123 w systemie Ubuntu. –

+1

@Burak Guzel: Zgodnie z instrukcją ** PHP ustawia stałą o nazwie 'CRYPT_SALT_LENGTH' która wskazuje najdłuższą dopuszczalną sól dozwoloną przez dostępne hasze **. –

+2

@Burak Guzel: CRYPT_SALT_LENGTH zwraca 60 do PHP 5.3.1, ale 123 z 5.3.2. Wynika to z faktu, że SHA-256 (sól o długości 64 karatów) i SHA-512 (sól o długości 123 karatów) zostały wprowadzone z PHP 5.3.2. – Sliq

Powiązane problemy