Learnit Training

Bezoekerswachtwoorden veilig opslaan met PHP? Gebruik Hashing!

Ook deze week was het weer flink raak: de wachtwoorden van miljoenen internet gebruikers liggen op straat. Terwijl de maker van de website dit eenvoudig hadden kunnen voorkomen.

Wat is het gevaar?

In tegenstelling tot computers zijn mensen niet echt goed in onthouden. Toch moet je overal wachtwoorden voor onthouden. Met als gevolg dat veel mensen één wachtwoord gebruiken voor meerdere websites. Dit brengt een groot beveiligingsrisico met zich mee. Als een wachtwoord uitlekt zijn gelijk alle accounts toegankelijk waar dit wachtwoord is hergebruikt.

Hoe voorkom je diefstal van bezoekerswachtwoorden?

De beste oplossing om wachtwoorden niet te laten stelen, is ze simpelweg niet te bewaren! In plaats daarvan gaan we de hash van het wachtwoord opslaan. Een hashfunctie maakt een wachtwoord onherkenbaar. Op basis van de hash is het onmogelijk de invoer te achterhalen. Een hashfunctie levert altijd hetzelfde resultaat op bij dezelfde invoer. Een sterke hashfunctie zorgt daarbij ook voor dat twee verschillende teksten niet in dezelfde hash resulteren (als dit wel gebeurt is er sprake van een collision). Zelfs als het hackers lukt om een database met hashes te bemachtigen hebben ze nog geen wachtwoorden in handen.

Hoe gebruik je de hash functies van PHP?

Sinds PHP 5.5 is het erg eenvoudig geworden om wachtwoorden te hashen met behulp van de functie password_hash(). Deze functie heeft één verplicht argument: het wachtwoord. Daarbij kan met het tweede argument aangegeven worden welk hashing algoritme er gebruikt moet worden. Als je dit niet opgeeft wordt er standaard gebruik gemaakt van het sterke BCrypt algoritme. Naast hashing voegt deze functie ook een Salt toe, die beschermt tegen Rainbow Tables. Het genereren van de hash gaat als volgt:

 
  $wachtwoord = 'Geheim-Wachtwoord';
  $hash = password_hash($wachtwoord, PASSWORD_BCRYPT);
  echo $hash;

De gegenereerde hash is een tekenreeks van 60 karakters en kan er als volgt uit zien: $2y$10$Se3mLsHueAYTM­3G4Wd9hTuyfzPCRYtafI­mcOSO2U0H4290jPU.SGO. Uit deze hash is het onmogelijk het wachtwoord te achterhalen. Deze hash kun je dus veilig in je database opslaan.

Om te controleren of iemand een correct wachtwoord heeft ingevoerd gebruiken we de functie password_verify(). Deze geven we twee argumenten mee, het wachtwoord dat is ingevoerd bij inloggen en de hash die we hadden opgeslagen.


  $hash = '$2y$10$Se3mLsHueAYTM3G4Wd9hTuyfzPCRYtafImcOSO2U0H4290jPU.SGO';
  $wachtwoord = 'Onzin';

  if (password_verify( $wachtwoord, $hash)){
      echo 'Correct wachtwoord';
  } else {
    echo 'Incorrect wachtwoord';
  }

In dit geval zal het gebruikerswachtwoord een andere hash opleveren dan in onze database stond opgeslagen. Zo kunnen we controleren of het ingevoerde wachtwoord correct is, zonder het originele wachtwoord op te hoeven slaan. Zelfs als een hacker toegang krijgt tot onze database is er geen wachtwoord te vinden.