NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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ězcem rounds=N, kde N 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ězcem rounds=N, kde N 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.


 

Předchozí článek
Převody textových řetězců v PHP
Všechny články v sekci
PHP funkce
Přeskočit článek
(nedoporučujeme)
Fonetické funkce a kódování HTML entit v PHP
Článek pro vás napsal Pavel Vaněček
Avatar
Uživatelské hodnocení:
4 hlasů
Autor se věnuje psaní článků na Itnetwork.cz
Aktivity