Ako na bezpečné heslá v PHP


  • Zdieľať na Google+

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.

Stiahnite si e-book Hacknite sa!

Buďte efektívnejší, rýchlejší a kreatívnejší. Nechajte sa inšpirovať technikami, ktorých princípy stále platia a riadime sa nimi doteraz. Prečítajte si výber toho najlepšieho z 10 ročnej histórie firemného blogu.

Osobné údaje (najmä e-mailovú adresu) spracúvame za účelom poskytnutia e-booku. Na poskytnuté osobné údaje sa vzťahujú zásady ochrany osobných údajov.

Komentáre

  • Martin
    Odpovedať
    Autor
    Martin

    Ak by niekto chcel sa pozriet pre helper a ma rad OOP 🙂 https://www.youtube.com/watch?v=yYm9uL8yhd8
    Inac pekny clanok a paci sa mi, ze konecne tuto funkciu spravili 🙂

  • Zakaznicek
    Odpovedať
    Autor
    Zakaznicek

    Pekny clanok. Takto sa ma pisat.

    Nie ako http://www.websupport.sk/blog/2015/03/najhorsie-svetove-domeny-vsetkych-cias/ ala Novy Cas.

  • Lars Schotte
    Odpovedať
    Autor
    Lars Schotte

    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.

  • Lars Schotte
    Odpovedať
    Autor
    Lars Schotte

    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.