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.