16. diel - Hashovanie textových reťazcov
V minulej lekcii, Prevody textových reťazcov v PHP , sme sa dozvedeli, ako prevádzať textové
reťazce v PHP. Ukázali sme si funkcie hex2bin()
,
bin2hex()
, base_convert()
a ord()
.
V tejto lekcii si ukážeme funkcie pre hashovanie textových reťazcov v PHP.
crypt()
Funkcia crypt()
vracia zahashovaný textový reťazec pomocou
algoritmu DES, Blowfish alebo MD5. Funkcia
prijíma celkom 2 parametre, kde prvým parametrom je náš textový reťazec.
Druhým parametrom je tzv. Soľ (angl. Salt), ktorá sa pridáva pred
hashovaný reťazec a značne skomplikuje dešifrovanie reťazca. Soľ nie je
vyžadovaná do PHP verzie 8.0.0, pokiaľ nie je špecifikovaná, je automaticky
vytvorená (neodporúča!). Túto funkciu môžeme využiť, ak napríklad
riešime zápis údajov užívateľov do databázy. Prípadnému útočníkovi,
ktorý vnikne do našej databázy skomplikuje dešifrovanie hesiel. Tieto
zahashované reťazce nemajú žiadnu dešifrovací funkciu, jedná sa teda iba
o jednosmernú šifrovací funkciu.
Rozlišujeme niekoľko hashovacie konštánt, ktoré sú nastavené v PHP, a to:
[CRYPT_STD_DES]
- Je štandardné hashovacie konštanta založená na algoritmu DES. Ako soľ zvolíme dva znaky z abecedy./0-9A-Za-z
. Ak sa budeme snažiť použiť iné znaky, funkcia zlyhá.[CRYPT_EXT_DES]
- Je rozšírená hashovacie konštanta založená na algoritmu DES. Ako soľ môžeme zvoliť deväť znakov kde na začiatku reťazca je podčiarkovník.[CRYPT_MD5]
- Je hashovacie konštanta založená na algoritmu MD5. Soľ môžeme zvoliť dvanásť znakov dlhý reťazec začínajúcich $ 1 $.[CRYPT_BLOWFISH]
- Hashovací konštanta založená na algoritme BLOWFISH. Soľ začína reťazcom $ 2a $, $ 2x $ alebo $ 2y $. Reťazec zvolíme 22 znakov dlhý, ale musí byť uzavretý z oboch strán znakom dolára $. Pokiaľ budeme chcieť zahashovat viac ako 72 znakov, funkcie ďalšie znaky oreže. Nesmieme preto prekročiť dĺžku![CRYPT_SHA_256]
- Hashovací konštanta založená na algoritme SHA-256. Soľ zvolíme šestnásť znakov dlhú začínajúcich reťazcom $ 5 $. Ak náš textový reťazec začína reťazcomrounds=N
, kdeN
je celé číslo, bude cyklus funkcia spustený práven
-krát. Defaultný hodnotou pre rounds = N je 5000, minimum je 1000 a maximum 999,999,999. Náš textový reťazec je z oboch strán uzavretý znakom dolára $.[CRYPT_SHA_512]
- Hashovací konštanta založená na algoritme SHA-512. Soľ zvolíme šestnásť znakov dlhú začínajúcich reťazcom $ 6 $. Ak náš textový reťazec začína reťazcomrounds=N
, kdeN
je celé číslo, bude cyklus funkcia spustený práve N-krát.
Ukážme si príklady:
if (CRYPT_STD_DES == 1) { echo crypt('Retezec ktery chci hashovat', 'A0'); }
Tu špecifikujeme použitie hashovacie konštanty
[CRYPT_STD_DES]
. Reťazec v podmienkovom bloku bude hashovanie
algoritmom DES so soľou 'A0'
. Na stránku dostaneme reťazec
A0ArLEkbqpQX2
. Ďalšie:
if (CRYPT_EXT_DES == 1) { echo crypt('Retezec ktery chci hashovat', '_B3.aerte'); }
Hashovacie konštanta [CRYPT_EXT_DES]
nám zahashuje reťazec
algoritmom DES. Reťazec v podmienkovom bloku bude hashovanie
so soľou '_B3.aerte'
a je tu dôležité podčiarkovník. Na
stránku dostaneme reťazec _B3.aerteEt8oHWebrd6
.
if (CRYPT_MD5 == 1) { echo crypt('Retezec ktery chci hashovat', '$1$ERT5398$'); }
Hashovacie konštanta [CRYPT_MD5 ]
nám zahashuje reťazec
algoritmom MD5. Reťazec v podmienkovom bloku bude hashovanie
so soľou '$1$ERT5398$'
. Výstupom na stránku bude reťazec
$1$ERT5398$6FP8/.cmRaueKnr72ueuL/
.
if (CRYPT_BLOWFISH == 1) { echo crypt('Retezec ktery chci hashovat', '$2a$04$dostatecnedlouhasul187$'); }
Hashovacie konštanta [CRYPT_BLOWFISH]
nám zahashuje reťazec
algoritmom BLOWFISH. Reťazec v podmienkovom bloku bude
hashovanie so soľou '$2a$04$dostatecnedlouhasul187$'
. Výstupom na
stránku bude dlhý reťazec obsahujúci z veľkej časti naši soľ
$2a$04$dostatecnedlouhasul18u25XdG4Yo01MYha2xVC.YfwMTMveRMyi
.
if (CRYPT_SHA256 == 1) { echo crypt('Retezec ktery chci hashovat', '$5$rounds=9999$nasezvolenasul$'); }
Hashovacie konštanta [CRYPT_SHA256 ]
nám zahashuje reťazec
algoritmom SHA256. Reťazec v podmienkovom bloku bude
hashovanie so soľou '$5$rounds=9999$nasezvolenasul$'
. Výstupom na
stránku bude dlhý reťazec obsahujúci z veľkej časti naši soľ
$5$rounds=9999$nasezvolenasul$fEiVLnxJiC9qIFoNNOpAHjOgXmmZyAVcMI6..T1lO09
.
if (CRYPT_SHA512 == 1) { echo crypt('Retezec ktery chci hashovat', '$6$rounds=6000$nasezvolenasul$'); }
Hashovacie konštanta [CRYPT_SHA512 ]
nám zahashuje reťazec
algoritmom SHA512. Reťazec v podmienkovom bloku bude
hashovanie so soľou '$6$rounds=9999$nasezvolenasul$'
. Výstupom na
stránku bude dlhý reťazec obsahujúci z veľkej časti naši soľ:
$6$rounds=6000$nasezvolenasul$yfjKsqN7vRPUrleY6pnIO0Wu2Y3D/JNTm/oiHp.vw1TL4C0F0bEIIGGP5M1pbGMx1VnerLSWJEsiaIBOqFS/K1`
sha1()
Je funkcia, ktorá nám zahashuje náš textový reťazec algoritmom
US Secure Hash Algorithm 1
. SHA-1 produkuje
160bitový výstup zvaný 'message digest', ktorý môže byť vstupom do
podpisového algoritmu, ktorý generuje alebo overí podpis (signatúru)
správy. Funkcia prijíma celkom 2 parametre, kde prvým z nich je náš
textový reťazec a druhým parametrom je booleanovská hodnota, ktorú
rozhodujeme o použití binárneho (20 znakov binárny formát) alebo
hexadecimálneho (40 znakov hexadecimálne číslo) výstupu. Funkcia vráti
zahashovaný reťazec SHA-1, v prípade neúspechu funkcie
vráti booleanovskou hodnotu false. Ukážme si príklady:
echo sha1("Hashování je zábava");
Funkcia sha1()
nám zahashuje textový reťazec
"Hashování je zábava"
, druhý parameter tu písať nemusíme,
jeho defaultná hodnota je false
(hexadecimálne výstup). Na
výstup dostaneme:
b345c4468f1cc8ee4167804103e3d892342e246f
Hashovanie s binárnym zápisom:
echo sha1("Hashování je zábava", true);
Reťazec bude zahashován a vypísaný vo 20tich znakovom binárnom formáte.
Na výstup dostaneme: EFAgA 4. $ O
.
sha1_file()
Funkcia sha1_file()
zahashuje obsah súboru a vypíše ho na
výstup. Hashovanie bude vykonané algoritmom
US Secure Hash Algorithm 1
, ktorý je pre SHA-1
charakteristický. Funkcia prijíma celkom 2 parametre, kde prvým z nich je
náš textový reťazec a druhým parametrom je booleanovská hodnota, ktorá
rozhoduje o použití binárneho (20 znakov binárny formát) alebo
hexadecimálneho (40 znakov hexadecimálne číslo) výstupu ako pri funkcii
sha1
. Funkcia vráti zahashovaný reťazec SHA-1,
v prípade neúspechu funkcie vráti booleanovskou hodnotu false
.
Ukážme si príklady:
echo sha1("muj_soubor.txt", false);
Funkcia sha1()
nám zahashuje náš textový súbor s obsahom
Tajny text v souboru
, druhý parameter tu písať nemusíme, jeho
defaultná hodnota je false
(hexadecimálne formát). Na výstup
dostaneme:
84bb791aaf8901cc8550bb4bd669fe454451cbb6
Rovnaký príklad, ale s binárnym výstupom:
echo sha1("muj_soubor.txt", true);
Reťazec bude zahashován a vypísaný vo 20tich znakovom binárnom formáte. Na výstup dostaneme:
!s90|'<[m(s}
Štvorčeky sú počítané ako dva znaky.
md5()
Funkcia md5()
zahashuje náš textový reťazec algoritmom
RSA Data Security, Inc. MD5 Message-Digest Algorithm
.
MD5 produkuje 128-bitový výstup zvaný 'message digest' alebo
'fingerprint'. Funkcia prijíma celkom 2 parametre, kde prvým z nich je náš
textový reťazec a druhým parametrom je booleanovská hodnota, ktorú
rozhodujeme o použití binárneho (16 znakov binárny formát) alebo
hexadecimálneho (32 znakov hexadecimálne číslo) výstupu. Funkcia vráti
zahashovaný reťazec MD5, v prípade neúspechu funkcie vráti
booleanovskou hodnotu false. Ukážme si príklady:
echo md5("Velice tajná informace");
Funkcia md5()
nám zahashuje náš textový reťazec
"Velice tajná informace"
, druhý parameter tu písať nemusíme,
jeho defaultná hodnota je false
(hexadecimálne výstup). Na
výstup dostaneme: 22f9871f4f0ab70b7c3479b0a27fa6a3
.
echo md5("Velice tajná informace", true);
Reťazec bude zahashován a vypísaný v 16tich znakovom binárnom formáte.
Na výstup dostaneme: "��O �|4y�� ��
.
Algoritmus MD5 nie je vhodný pre hashovanie hesiel!
md5_file()
Funkcia md5_file()
zahashuje obsah súboru a vypíše ho na
výstup. Hashovanie bude vykonané algoritmom
RSA Data Security, Inc. MD5 Message-Digest Algorithm
, ktorý je pre
MD5 charakteristický. Funkcia prijíma celkom 2 parametre, kde
prvým z nich je náš textový reťazec a druhým parametrom je booleanovská
hodnota, ktorú rozhodujeme o použití binárneho (16 znakov binárny formát)
alebo hexadecimálneho (32 znakov hexadecimálne číslo) výstupu. Funkcia
vráti zahashovaný reťazec MD5, v prípade neúspechu funkcie
vráti booleanovskou hodnotu false. Ukážme si príklady:
echo md5("tajne.txt");
Funkcia md5()
nám zahashuje náš textový súbor s obsahom
Top secret!
, Druhý parameter tu písať nemusíme, jeho defaultná
hodnota je false (hexadecimálne výstup). Na výstup dostaneme:
a1b3f7cd31e05bd049a5b9adcdb0598b
.
echo md5("tajne.txt", true);
Reťazec bude zahashován a vypísaný v 16tich znakovom binárnom formáte:
`�0U��]Q��;�_h`
V ďalšej lekcii, Fonetickej funkcie a kódovanie HTML entít v PHP , si ukážeme ďalšie užitočné funkcie pre prácu s textovými reťazcami a prevod textového reťazca na HTML entity a naopak.