Kategórie
Ostatné Technológie Tipy a triky Vzdelávanie

Ako na bezpečné heslá v PHP

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]

Autor: Tomáš Tatarko

Vo WebSupporte začínal ako developer, dnes pracuje ako Head of Internal Tools. Má pod palcom WebAdmina a je autorom nástroja Follow Company.

4 odpovede na “Ako na bezpečné heslá v PHP”

Hento s tyma heslami je presne tak, ako v /etc/shaddow, lebo tam tiez podla tych prvych charakterov zisti, ze s akym algoritmom su encodovane tie hesla a preto to nie je problem, ked by mal kazdy user iny algoritmus pouzity pre heslo, resp furt novsi, podla toho, kedy bol vytvoreny user.

najlepsie je komplet DIGEST authentifikacia, lebo hento ma jednu velku chybu a to je, ze to heslo nejako sa mosi do tej aplikacie dostat, ked sa typek prihlasit xce. cize bez SSL/TLS nejde nist, kedze tam je to prenasane v cleartexte.
a co potom? ak je teraz napr. encryption toho hesla v blowfishi, tak by som rad videl, ako s tym spravia digest.
akoze tento problem je aj pri IMAPe, ako som sa ja smal, ked prisol hart-bleed, ako setci saleli, ze jaaaj, SSLko je v gt-lt.
a nikdo nepride s tym, ze by to chcelo komplet to cele robit s SHA256, digest, a aj heslo ulozene v databanke tak.
server by potom vygeneroval noncu, a z kombinacii oboch SHA256 by spravil SHA256, klient to iste a potom by bolo jedine, co by bolo cez siet prenasane cleartext nonca, kera by bola valid len pre jedno spojenie (ip+port) + vysledna SHA256.

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená.