Uczę się o funkcji crypt() PHP i przeprowadziłem z nią kilka testów. Według this post, powinienem użyć soli o długości 22 znaków. Mogę jednak użyć ciągu znaków o długości 23 znaków z pewnymi ograniczeniami. Kiedy używam 22-znakowego łańcucha, zawsze otrzymuję wynik "$ 2y $ xxStringStringStringStri.HashHashHashHashHashHashHashHas". Wiem, że okres jest po prostu częścią soli.Dlaczego nie powinienem używać 23. znaku w soli funkcji krypta()?
Wygląda na to, że jeśli użyję 23 znaków zamiast tylko 22, uda mi się wygenerować różne skróty, ale tylko 4 różne wyniki dla wszystkich 64 znaków. 23. Znak „zaokrągla w dół” z dokładnością do 1/4 z alfabetu 64 znaków (na przykład 23. postać jest „W” i zaokrągla w dół „O” lub dowolną liczbę rund do litery „U”)
v---------------v---------------v---------------v---------------
./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890
Wszystkie cztery z tych funkcji krypt wytworzenia tej samej soli:
crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAq');
crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAr');
crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAs');
crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAt');
Ale to jest inna:
crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAu');
Więc dlaczego nie powinno się używać 23 charakter, kiedy z powodzeniem może wygenerować różne wyniki? Czy jest jakiś rodzaj niestabilnego zachowania w PHP, którego należy unikać, nie używając go?
Dla wyjaśnienia, w jaki sposób liczę 23 znaków w soli:
crypt('Test123','$2y$08$ABCDEFGHIJKLMNOPQRSTUV');
// The salt is '$ABCDEFGHIJKLMNOPQRSTUV'
// Which will be treated as '$ABCDEFGHIJKLMNOPQRSTUO'
Istnieje dobre wyjaśnienie na to pytanie: http://security.stackexchange.com/questions/20862/php-crypt-trims-the-salt-as-it-would-be-too-long –
Dziękuję za ta odpowiedź. Chociaż dotyczy to tylko tego, co dzieje się z 23. znakiem, ponieważ jest ono skracane tylko z powodu rozmiaru bitów dozwolonych w funkcji crypt(). Moje pytanie, w inny sposób pytające, brzmi: "Czy powinienem używać 23 litery, nawet jeśli zostanie porąbane na dwa kawałki?" lub w inny sposób: "Czy jest jakiś błąd w algorytmie PHP, który generuje niepoprawne hashy, gdy używany jest 23 znak?" – Andrew