IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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ťazcom rounds=N, kde N je celé číslo, bude cyklus funkcia spustený práve n -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ťazcom rounds=N, kde N 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.


 

Predchádzajúci článok
Prevody textových reťazcov v PHP
Všetky články v sekcii
PHP funkcie
Preskočiť článok
(neodporúčame)
Fonetickej funkcie a kódovanie HTML entít v PHP
Článok pre vás napísal Pavel Vaněček
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje psaní článků na Itnetwork.cz
Aktivity