Hashovací funkce a metody jednosměrného šifrování

Hashování (na rozdíl od šifrování) umí ze vstupu vytvořit jen výstup (a už to nejde obráceně). Slouží tedy pro ochránění původních dat (například hesel), nebo pro kontrolu stejnosti dat.

Hashovací funkce

V PHP existuje mnoho hashovacích funkcí, ty důležité jsou:

  • Bcrypt – Nejbezpečnější hashování hesel, výpočetně pomalá, používá vnitřní salt a hashuje iterativně.
  • MD5 – Velice rychlá funkce vhodná pro hashování souborů. Výstup má vždy 32 znaků.
  • SHA1 – Rychlá hashovací funkce pro hashování souborů, používá ji interně Git pro hashovací commitů. Výstup má vždy 40 znaků.

Zahashování

1 $password = 'tajne-heslo';
2 
3 echo bcrypt($password);
4 echo md5($password);
5 echo sha1($password);

Pozor: Funkcemd5() ani sha1() není vhodná k hashování hesel, protože je výpočetně jednoduché původní heslo odhalit, nebo si hesla aspoň předpočítat. Mnohem lepší je použít bcrypt, který pro hashování hesel vznikl.

Web http://www.md5cracker.com obsahuje databázi kontrolních součtů (hashů), zkuste vyhledat třeba tento hash: 79c2b46ce2594­ecbcb5b73e9283­45492, jak je vidět, tak čisté md5() není zas tak bezpečné pro časté slova a hesla.

Solení hesel

Jedná se o specifický řetězec, který je vložen na konec každého hesla, a až to se šifruje. Tento postup je o něco bezpečnější, protože útočník musí při slovníkovém útoku brát v potaz všechny možné hesla i všechny možné „ocásky“. Příklad:

1 $password = 'tajne_heslo';
2 $hash = md5($password . 'fghjgtzjjhg');
3 
4 echo $password; // vypíše původní heslo
5 echo $hash;  // vypíše hash hesla včetně ocásku

Ocásek by měl být nějaký originální a těžko uhádnutelný text, ideálně náhodný a složitý. V příkladě jsem použil poměrně jednoduchý, v praxi se však používá mnohem složitější. Občas se jako ocásek používá nějaká snadno zjistitelná originální informace. Pokud hashujete uživatelské heslo, tak může být jako ocásek použit např. hash uživatelova přihlašovacího jmé­na.

Složené hashovací funkce

Bezpečnost se nadále zvedá v případě, kdy zanoříme více hashovacích funkcí a šifrujeme jednu pomocí druhé. Názorný příklad:

1 $password = 'tajne_heslo';
2 $hash = md5(sha1($password . 'fdhfsjkhfksjdfhsdkf'));
3 
4 echo $password; // vypíše původní heslo
5 echo $hash;  // vypíše hash hesla včetně vnořeného hashe a ocásku
Sponzorované odkazy
Pomohl Vám tento článek?