Lekce 16 - Hashování textových řetězců v PHP
V minulé lekci, Převody textových řetězců v PHP, jsme se dozvěděli, jak převádět textové
řetězce v PHP. Ukázali jsme si funkce hex2bin()
,
bin2hex()
, base_convert()
a ord()
.
V této lekci si ukážeme funkce pro hashování textových řetězců v PHP.
crypt()
Funkce crypt()
vrací zahashovaný textový řetězec pomocí
algoritmu DES, Blowfish nebo MD5. Funkce
přijímá celkem 2 parametry, kde prvním parametrem je náš textový
řetězec. Druhým parametrem je tzv. sůl (angl. salt), která se
přidává před hashovaný řetězec a značně zkomplikuje dešifrování
řetězce. Sůl není vyžadována do PHP verze 8.0.0, pokud není
specifikována, je automaticky vytvořena (není doporučeno!). Tuto funkci
můžeme využít, pokud například řešíme zápis údajů uživatelů do
databáze. Případnému útočníkovi, který vnikne do naší databáze
zkomplikujeme dešifrování hesel. Tyto zahashované řetězce nemají žádnou
dešifrovací funkci, jedná se teda pouze o jednosměrnou šifrovací
funkci.
Rozlišujeme několik hashovacích konstant, které jsou nastaveny v PHP, a to:
[CRYPT_STD_DES]
- Je standardní hashovací konstanta založená na algoritmu DES. Jako sůl zvolíme dva znaky z abecedy./0-9A-Za-z
. Pokud se budeme snažit použít jiné znaky, funkce selže.[CRYPT_EXT_DES]
- Je rozšířená hashovací konstanta založená na algoritmu DES. Jako sůl můžeme zvolit devět znaků kde na začátku řetězce je podtržítko.[CRYPT_MD5]
- Je hashovací konstanta založená na algoritmu MD5. Sůl můžeme zvolit dvanáct znaků dlouhý řetězec začínající $1$.[CRYPT_BLOWFISH]
- Hashovací konstanta založená na algoritmu BLOWFISH. Sůl začíná řetězcem $2a$, $2x$ nebo $2y$. Řetězec zvolíme 22 znaků dlouhý, ale musí být uzavřen z obou stran znakem dolaru $. Pokud budeme chtít zahashovat více než 72 znaků, funkce další znaky ořízne. Nesmíme proto překročit délku![CRYPT_SHA_256]
- Hashovací konstanta založená na algoritmu SHA-256. Sůl zvolíme šestnáct znaků dlouhou začínající řetězcem $5$. Pokud náš textový řetězec začíná řetězcemrounds=N
, kdeN
je celé číslo, bude cyklus funkce spuštěn právěn
-krát. Defaultní hodnotou pro rounds=N je 5000, minimum je 1000 a maximum 999,999,999. Náš textový řetězec je z obou stran uzavřený znakem dolaru $.[CRYPT_SHA_512]
- Hashovací konstanta založená na algoritmu SHA-512. Sůl zvolíme šestnáct znaků dlouhou začínající řetězcem $6$. Pokud náš textový řetězec začíná řetězcemrounds=N
, kdeN
je celé číslo, bude cyklus funkce spuštěn právě N-krát.
Ukažme si příklady:
if (CRYPT_STD_DES == 1) { echo crypt('Retezec ktery chci hashovat', 'A0'); }
Zde specifikujeme použití hashovací konstanty
[CRYPT_STD_DES]
. Řetězec v podmínkovém bloku bude hashován
algoritmem DES se solí 'A0'
. Na stránku dostaneme řetězec
A0ArLEkbqpQX2
. Další:
if (CRYPT_EXT_DES == 1) { echo crypt('Retezec ktery chci hashovat', '_B3.aerte'); }
Hashovací konstanta [CRYPT_EXT_DES]
nám zahashuje řetězec
algoritmem DES. Řetězec v podmínkovém bloku bude hashován
se solí '_B3.aerte'
a je zde důležité podtržítko. Na stránku
dostaneme řetězec _B3.aerteEt8oHWebrd6
.
if (CRYPT_MD5 == 1) { echo crypt('Retezec ktery chci hashovat', '$1$ERT5398$'); }
Hashovací konstanta [CRYPT_MD5 ]
nám zahashuje řetězec
algoritmem MD5. Řetězec v podmínkovém bloku bude hashován
se solí '$1$ERT5398$'
. Výstupem na stránku bude řetězec
$1$ERT5398$6FP8/.cmRaueKnr72ueuL/
.
if (CRYPT_BLOWFISH == 1) { echo crypt('Retezec ktery chci hashovat', '$2a$04$dostatecnedlouhasul187$'); }
Hashovací konstanta [CRYPT_BLOWFISH]
nám zahashuje řetězec
algoritmem BLOWFISH. Řetězec v podmínkovém bloku bude
hashován se solí '$2a$04$dostatecnedlouhasul187$'
. Výstupem na
stránku bude dlouhý řetězec obsahující z velké části naši sůl
$2a$04$dostatecnedlouhasul18u25XdG4Yo01MYha2xVC.YfwMTMveRMyi
.
if (CRYPT_SHA256 == 1) { echo crypt('Retezec ktery chci hashovat', '$5$rounds=9999$nasezvolenasul$'); }
Hashovací konstanta [CRYPT_SHA256 ]
nám zahashuje řetězec
algoritmem SHA256. Řetězec v podmínkovém bloku bude
hashován se solí '$5$rounds=9999$nasezvolenasul$'
. Výstupem na
stránku bude dlouhý řetězec obsahující z velké části naši sůl
$5$rounds=9999$nasezvolenasul$fEiVLnxJiC9qIFoNNOpAHjOgXmmZyAVcMI6..T1lO09
.
if (CRYPT_SHA512 == 1) { echo crypt('Retezec ktery chci hashovat', '$6$rounds=6000$nasezvolenasul$'); }
Hashovací konstanta [CRYPT_SHA512 ]
nám zahashuje řetězec
algoritmem SHA512. Řetězec v podmínkovém bloku bude
hashován se solí '$6$rounds=9999$nasezvolenasul$'
. Výstupem na
stránku bude dlouhý řetězec obsahující z velké části naši sůl:
$6$rounds=6000$nasezvolenasul$yfjKsqN7vRPUrleY6pnIO0Wu2Y3D/JNTm/oiHp.vw1TL4C0F0bEIIGGP5M1pbGMx1VnerLSWJEsiaIBOqFS/K1`
sha1()
Je funkce, která nám zahashuje náš textový řetězec algoritmem
US Secure Hash Algorithm 1
. SHA-1 produkuje
160bitový výstup zvaný 'message digest', který může být vstupem do
podpisového algoritmu, který generuje nebo ověřuje podpis (signaturu)
zprávy. Funkce přijímá celkem 2 parametry, kde prvním z nich je náš
textový řetězec a druhým parametrem je booleanovská hodnota, kterou
rozhodujeme o použití binárního (20 znaků binární formát) nebo
hexadecimálního (40 znaků hexadecimální číslo) výstupu. Funkce vrátí
zahashovaný řetězec SHA-1, v případě neúspěchu funkce
vrátí booleanovskou hodnotu false. Ukažme si příklady:
echo sha1("Hashování je zábava");
Funkce sha1()
nám zahashuje textový řetězec
"Hashování je zábava"
, druhý parametr zde psát nemusíme, jeho
defaultní hodnota je false
(hexadecimální výstup). Na výstup
dostaneme:
b345c4468f1cc8ee4167804103e3d892342e246f
Hashování s binárním zápisem:
echo sha1("Hashování je zábava", true);
Řetězec bude zahashován a vypsán ve 20ti znakovém binárním formátu. Na výstup dostaneme: `�E�F���Ag�A�ؒ4.$o `.
sha1_file()
Funkce sha1_file()
zahashuje obsah souboru a vypíše jej na
výstup. Hashování bude provedeno algoritmem
US Secure Hash Algorithm 1
, který je pro SHA-1
charakteristický. Funkce přijímá celkem 2 parametry, kde prvním z nich je
náš textový řetězec a druhým parametrem je booleanovská hodnota, která
rozhoduje o použití binárního (20 znaků binární formát) nebo
hexadecimálního (40 znaků hexadecimální číslo) výstupu jako u funkce
sha1
. Funkce vrátí zahashovaný řetězec SHA-1,
v případě neúspěchu funkce vrátí booleanovskou hodnotu
false
. Ukažme si příklady:
echo sha1("muj_soubor.txt", false);
Funkce sha1()
nám zahashuje náš textový soubor s obsahem
Tajny text v souboru
, druhý parametr zde psát nemusíme, jeho
defaultní hodnota je false
(hexadecimální formát). Na výstup
dostaneme:
84bb791aaf8901cc8550bb4bd669fe454451cbb6
Stejný příklad, ale s binárním výstupem:
echo sha1("muj_soubor.txt", true);
Řetězec bude zahashován a vypsán ve 20ti znakovém binárním formátu. Na výstup dostaneme:
!s90|'<[m(s}
Čtverečky jsou počítány jako dva znaky.
md5()
Funkce md5()
zahashuje náš textový řetězec algoritmem
RSA Data Security, Inc. MD5 Message-Digest Algorithm
.
MD5 produkuje 128bitový výstup zvaný 'message digest' nebo
'fingerprint'. Funkce přijímá celkem 2 parametry, kde prvním z nich je náš
textový řetězec a druhým parametrem je booleanovská hodnota, kterou
rozhodujeme o použití binárního (16 znaků binární formát) nebo
hexadecimálního (32 znaků hexadecimální číslo) výstupu. Funkce vrátí
zahashovaný řetězec MD5, v případě neúspěchu funkce
vrátí booleanovskou hodnotu false. Ukažme si příklady:
echo md5("Velice tajná informace");
Funkce md5()
nám zahashuje náš textový řetězec
"Velice tajná informace"
, druhý parametr zde psát nemusíme,
jeho defaultní hodnota je false
(hexadecimální výstup). Na
výstup dostaneme: 22f9871f4f0ab70b7c3479b0a27fa6a3
.
echo md5("Velice tajná informace", true);
Řetězec bude zahashován a vypsán v 16ti znakovém binárním formátu. Na
výstup dostaneme: "��O �|4y����
.
Algoritmus MD5 není vhodný pro hashování hesel!
md5_file()
Funkce md5_file()
zahashuje obsah souboru a vypíše jej na
výstup. Hashování bude provedeno algoritmem
RSA Data Security, Inc. MD5 Message-Digest Algorithm
, který je pro
MD5 charakteristický. Funkce přijímá celkem 2 parametry,
kde prvním z nich je náš textový řetězec a druhým parametrem je
booleanovská hodnota, kterou rozhodujeme o použití binárního (16 znaků
binární formát) nebo hexadecimálního (32 znaků hexadecimální číslo)
výstupu. Funkce vrátí zahashovaný řetězec MD5, v
případě neúspěchu funkce vrátí booleanovskou hodnotu
false. Ukažme si příklady:
echo md5("tajne.txt");
Funkce md5()
nám zahashuje náš textový soubor s obsahem
Top secret!
, druhý parametr zde psát nemusíme, jeho defaultní
hodnota je false (hexadecimální výstup). Na výstup dostaneme:
a1b3f7cd31e05bd049a5b9adcdb0598b
.
echo md5("tajne.txt", true);
Řetězec bude zahashován a vypsán v 16ti znakovém binárním formátu:
`�0U��]Q��;�_h`
V další lekci, Fonetické funkce a kódování HTML entit v PHP, si ukážeme další užitečné funkce pro práci s textovými řetězci a převod textového řetězce na HTML entity a naopak.