Funkcja crypt() w PHP
Definicja i użycie
Funkcja crypt() zwraca ciąg szyfrowany używając algorytmów DES, Blowfish lub MD5.
Zachowanie tej funkcji różni się w zależności od systemu operacyjnego, niektóre systemy operacyjne wspierają więcej niż jeden typ algorytmu. W czasie instalacji PHP sprawdza, które algorytmy są dostępne oraz jakie algorytmy są używane.
Konkretny algorytm zależy od formatu i długości parametru soli. Sól może zwiększyć bezpieczeństwo szyfrowania, zwiększając liczbę ciągów generowanych przez określony ciąg używanego do szyfrowania.
Oto kilka stałych używanych z funkcją crypt(). Wartości tych stałych są ustawiane przez PHP w czasie instalacji.
Stała:
[CRYPT_SALT_LENGTH] | Domyślna długość szyfrowania. Użycie standardowego szyfrowania DES, długość wynosi 2. |
[CRYPT_STD_DES] | Funkcja hashowania oparta na standardowym algorytmie DES używa dwóch znaków z znaków "/./0-9A-Za-z" jako wartości soli. Użycie niedozwolonych znaków w wartości soli spowoduje, że funkcja crypt() zwróci błąd. |
[CRYPT_EXT_DES] | Rozszerzona funkcja hashowania oparta na algorytmie DES. Wartość soli to ciąg znaków o długości 9 znaków, złożony z jednego podkreślenia, 4 bajtów liczby iteracji i 4 bajtów wartości soli. Są one kodowane w postaci znaków drukowalnych, każdy znak z 6 bitami, gdzie priorytet mają znaki o najmniejszej liczbie有效位的优先。Liczby od 0 do 63 są kodowane jako "/./0-9A-Za-z". Użycie niedozwolonych znaków w wartości soli spowoduje, że funkcja crypt() zwróci błąd. |
[CRYPT_MD5] | Haszowanie MD5 używa 12-znakowego ciągu znaków soli zaczynającego się od $1$. |
[CRYPT_BLOWFISH] | Algorytm Blowfish używa soli w formie "$2a$", dwóch miejscowych parametrów cost, "$", oraz 64-bitowego ciągu znaków złożonego z znaków z zakresu "./0-9A-Za-z". Użycie znaków spoza tego zakresu spowoduje, że funkcja crypt() zwróci pusty ciąg znaków. Dwa miejscowe parametry cost są logarytmem o podstawie 2 liczby iteracji, deren zakres wynosi 04-31. Wartości poza tym zakresem spowodują, że funkcja crypt() zakończy się niepowodzeniem. |
CRYPT_SHA256 | Algorytm SHA-256 używa 16-znakowego ciągu znaków soli zaczynającego się od $5$. Jeśli ciąg soli zaczyna się od "rounds=<N>$", wartość liczby N będzie używana do określenia liczby iteracji hashowania, co jest podobne do parametru cost algorytmu Blowfish. Domyślna liczba iteracji to 5000, minimalna to 1000, a maksymalna to 999,999,999. Wartości N poza tym zakresem będą przekształcane na najbliższą wartość. |
CRYPT_SHA512 | Algorytm SHA-512 używa 16-znakowego ciągu znaków soli zaczynającego się od $6$. Jeśli ciąg soli zaczyna się od "rounds=<N>$", wartość liczby N będzie używana do określenia liczby iteracji hashowania, co jest podobne do parametru cost algorytmu Blowfish. Domyślna liczba iteracji to 5000, minimalna to 1000, a maksymalna to 999,999,999. Wartości N poza tym zakresem będą przekształcane na najbliższą wartość. |
Na systemach, które obsługują wiele algorytmów, jeśli obsługuje powyższe stałe, ustaw na "1", w przeciwnym razie ustaw na "0".
Komentarz:Nie ma odpowiedniej funkcji deszyfrowania. Funkcja crypt() używa algorytmu jednostronnego.
Gramatyka
crypt(str,sól)
Parametry | Opis |
---|---|
str | Wymagane. Określa ciąg znaków do zakodowania. |
sól | Opcjonalne. Używane do zwiększenia liczby kodowanych znaków, aby zwiększyć bezpieczeństwo kodowania. Jeśli nie podano parametru soli, PHP losowo generuje go przy każdym wywołaniu funkcji. |
Szczegółowe informacje techniczne
Zwracana wartość: | Zwraca zaszyfrowany ciąg znaków lub ciąg znaków krótszy niż 13 znaków, aby w przypadku niepowodzenia można go odróżnić od soli. |
Wersja PHP: | 4+ |
Aktualizacje logu
Wersja | Opis |
---|---|
5.3.2 | Na podstawie implementacji Ulricha Dreppera, dodano crypt oparty na algorytmach SHA-256 i SHA-512. |
5.3.2 | Poprawił problem z algorytmem Blowfish spowodowanym niewłaściwymi cykлами, zwracając ciąg "niepowodzenie" ('*0' lub '*1') zamiast przejścia do algorytmu DES. |
5.3.0 | PHP zawiera własną implementację MD5 Crypt, w tym standardowy algorytm DES, rozszerzony algorytm DES oraz algorytm Blowfish. Jeśli system brakuje odpowiedniej implementacji, PHP użyje własnej implementacji. |
Przykład
Przykład 1
W tym przykładzie przetestujemy różne algorytmy:
<?php // Dwuznakowy salt if (CRYPT_STD_DES == 1) { echo "Standardowy DES: ".crypt('coś','st')."\n<br>"; } else { echo "Standardowy DES nie jest obsługiwanym.\n<br>"; } // 4 znaków salt if (CRYPT_EXT_DES == 1) { echo "Rozszerzony DES: ".crypt('coś','_S4..some')."\n<br>"; } else { echo "Rozszerzony DES nie jest obsługiwanym.\n<br>"; } // Zaczynający się od $1$ 12 znaków if (CRYPT_MD5 == 1) { echo "MD5: ".crypt('coś','$1$somethin$')."\n<br>"; } else { echo "MD5 nie jest obsługiwanym.\n<br>"; } // Salt zaczynający się od $2a$. Dwuznakowy parametr kosztu: 09. 22 znaki if (CRYPT_BLOWFISH == 1) { echo "Blowfish: ".crypt('coś','$2a$09$anexamplestringforsalt$')."\n<br>"; } else { echo "Blowfish DES nie jest obsługiwanym.\n<br>"; } // Sól zaczynająca się od $5$ to 16 znaków. Domyślna liczba rund to 5000. if (CRYPT_SHA256 == 1) { echo "SHA-256: ".crypt('coś','$5$rounds=5000$anexamplestringforsalt$')."\n<br>"; else { echo "SHA-256 nie jest obsługiwane.\n<br>"; } // Sól zaczynająca się od $5$ to 16 znaków. Domyślna liczba rund to 5000. if (CRYPT_SHA512 == 1) { echo "SHA-512: ".crypt('something','$6$rounds=5000$anexamplestringforsalt$'); } else { echo "SHA-512 nie jest obsługiwane."; } ?>
Wynik kodu powyżej (zależy od systemu operacyjnego):
Standardowy DES: stqAdD7zlbByI Rozszerzony DES: _S4..someQXidlBpTUu6 MD5: $1$somethin$4NZKrUlY6r7K7.rdEOZ0w. Blowfish: $2a$09$anexamplestringforsaleLouKejcjRlExmf1671qw3Khl49R3dfu SHA-256: $5$rounds=5000$anexamplestringf$KIrctqsxo2wrPg5Ag/hs4jTi4PmoNKQUGWFXlVy9vu9 SHA-512: $6$rounds=5000$anexamplestringf$Oo0skOAdUFXkQxJpwzO05wgRHG0dhuaPBaOU/ oNbGpCEKlf/7oVM5wn6AN0w2vwUgA0O24oLzGQpp1XKI6LLQ0.