PHP: ukládání hesla

24. 10. 2022

Ukládat heslo do databáze v čitelné podobě je nebezpečné zlo. V případě bezpečnostního incidentu útočník snadno získá čitelné heslo a bohužel stále mnoho uživatelů využívá jedno heslo pro více služeb. Je důležité do databáze ukládat pouze hash hesla. Naštěstí PHP nabízí tři velice jednoduché metody pro hashování hesla. Celý proces si ukážeme na jednoduché ukázce níže.

<?php declare(strict_types=1);

/**
 * Pro převod hesla na hash souží v PHP funkce "password_hash".
 * Výchozí algoritmus pro šifrování se používá Bcryp.
 */
$passwordHash = password_hash('my-password', PASSWORD_DEFAULT);

/**
 * Pro kontrolu správnosti hesla slouží metoda "password_verify".
 */
if (password_verify('my-password', $passwordHash)) {

   /**
    * Metodou "password_needs_rehash" zjistíme zda heslo dokážeme bezpečněji zahashovat.
    * V případě že ano, provedeme aktualizaci hashe hesla u identity uživatele.
    */
   if (password_needs_rehash($passwordHash, PASSWORD_DEFAULT)) {
       $newPasswordHash = password_hash('my-password', PASSWORD_DEFAULT);

       // ...Save $newPasswordHash to DB...
   }
}

Jak integrovat hashování hesla a jeho ověření do projektu?

Hashování hesel je jedna polovina bezpečnosti. Druhou důležitou polovinou je samotná integrace do vašeho projektu. V tomto bloku si řekneme několik bodů jak udělat integraci co nejvíce bezpečnou.

  • Metody ověření a hashování vložte do privátních metod - služeb tak aby nebylo možné je přetížit v jiné částí projektu a tím v případě chyby obejít správnou funkčnost.
  • V samotných metodách pracujte s důvěrnými daty pouze uvnitř a nikdy je nevracejte ven. Chyby ošetřete výjimkou a správné zpracování boolean hodnotou. 
  • Nastavte uživatelům kritéria na minimální délku hesla a nutnost použít znaky, čísla a speciální znaky.
  • Ošetřete endpoint ověření a hashování na útoku hrubou silou (brute force attack), DDoS a možnosti podvržení požadavku CSFR tokenem.
  • Pro další zvýšení bezpečnosti můžete hesla rozšířit o vlastní unikátní salt pro každého uživatele uložené separátně například i na jiném zařízení a nebo formátu.

Pro usnadnění práce můžete využít například již vytvořenou knihovnu Nette security - https://doc.nette.org/cs/security/authentication

Nejnovější příspěvky