Prihlasujú sa na vašej stránke používatelia pomocou hesla? Ak áno, treba rátať s tým, že väčšina ľudí používa na zabezpečenie svojho účtu jednoduché a pre nich ľahko zapamätateľné heslá. „Ideálne“ pre všetky služby rovnaké heslo. Preto na vás padá dosť vysoká zodpovednosť tieto heslá čo najlepšie ochrániť. Ako teda na bezpečné heslá v PHP?

Pevné verím, že dnes sa už nenájde programátor, ktorý by heslá ukladal v databáze v plain texte (presne tak, ako ich človek vyplnil). Bohužiaľ bežnou praxou ešte stále ostáva využívať na tieto účely jednoduché hashovacie funkcie ako md5(), sha1() a podobne. Tie však vznikli kvôli úplne inému účelu, ako je zabezpečovanie hesiel. PHP od verzie 5.5 na to ponúka jednoduchú sadu funkcií:

$encrypted = password_hash("tajneheslo", PASSWORD_DEFAULT);
// $2y$10$0c.UyV1FqPecM0DOoqiH6uS0/D/0NtxBGtEMUjM6.Mn6bmZmvDMOu

V premennej $encrypted máme teraz unikátny hash pre vstupné heslo. Práve túto hodnotu si uložíme do databázy k používateľovi pre overenie hesla pri ďalšom prihlasení. Pre tento úkon využijeme druhú z dostupných funkcií:

if(password_verify("tajneheslo", $encrypted)) {
// spravne heslo, prihlasim pouzivatela
} else {
// nespravne heslo
}

Celý postup je jednoduchý na implementáciu a z hľadiska bezpečnosti získate hneď niekoľko výhod:

  • Vďaka PASSWORD_DEFAULT využívate vždy najnovší (a teda najbezpečnejší) algoritmus. Momentálne odkazuje na CRYPT_BLOWFISH, no vývojári PHP budú túto konštantu v prípade potreby aktualizovať. Ak tak aj urobia, nemusíte sa báť, že by ste svoje aktuálne heslá nevedeli overiť. Informácia o použitom algoritme je súčasťou hashu (medzi prvým a druhým $) – odtiaľ si to prečíta funkcia password_verify() a pri overovaní hesla teda použije správny algoritmus.

  • Pri generovaní hashu každého hesla sa použije náhodný salt. Čiže ak 100 vaších používateľov bude mať rovnaké heslo, nebudú mať vo výsledku rovnaký hash. Funkcia password_hash() síce ponúka možnosť zvoliť si vlastný salt, avšak nepovažuje sa to za dobrú praktiku.

  • Predvolene sa používa algoritmus pri určenej časovej náročnosti (cost = 10). To znamená, ža ak aj niekto získa hashe z vašej databázy a následne sa bude snažiť hrubou silou dostať k heslu, tak každý pokus mu bude podstatnú chvíľu trvať. Predvolená hodnota je už dostatočne bezpečná, no pomocou tretieho argumentu funkcie password_hash() ju môžete navýšiť. Môžete si tak bezpečnosť ešte zvýšiť, no treba myslieť na to, že aj samotné generovanie hashu (pri registrácií) a jeho overenie (pri prihlasovaní) bude dlhšie trvať – preto treba zvoliť správnu hodnotu podľa HW, aby vaši návštevníci dlho nečakali.

Nebeží vaša stránka na PHP 5.5, alebo vyššej verzii? V našom admine dokážete prepnúť verziu na novšiu jedným klikom. Okrem sady týchto funkcií získate mnoho ďalších noviniek a vaša stránka môže v konečnom dôsledku pobežať rýchlejšie.

[mc4wp_form]

Komentáre