We plaatsen een cookie voor Google Analytics om onze website te verbeteren

Met een cookie kun je advertenties personaliseren. Wij hanteren echter de strikte regels van de Autoriteit Persoonsgegevens. Surfgedrag houden we niet bij en we achtervolgen je ook niet met reclame.

Wacht.., hoe sla ik dat woord op? Veilig je wachtwoorden opslaan!

Wachtwoord opslaan: Veilig je wachtwoorden opslaanAls je je eigen website maakt, kom je er misschien al snel op uit dat je accounts aan wilt maken voor je bezoekers. Eerder schreef ik op deze plaats al een achtergrondartikel over het opslaan van wachtwoorden en vertelde ik wat je kunt doen om je eigen wachtwoord veilig te houden, maar de praktische invulling voor jou als webmaster heb ik in het midden gelaten: hoe pak je zoiets nou aan?

Als je gebruik maakt van een groot softwarepakket als WordPress of phpBB, dan ben je in het algemeen al veilig. Hoewel het erg lastig is om uit te zoeken wat er binnen deze systemen precies met je wachtwoord gebeurt, is het in ieder geval makkelijk te controleren dat het wachtwoord niet onversleuteld in de database terechtkomt. Bovendien zou je erop moeten kunnen vertrouwen dat pakketten als deze, goed over de beveiliging nadenken.

Wil je zeker weten dat je softwarepakket een veilig pakket is, dan is het verstandig om eens te kijken of je via een database, als de Amerikaanse National Vulnerability Database, beveiligingsproblemen kunt vinden met het pakket dat je op het oog hebt. Staan er veel problemen voor jouw softwarepakket, dan kun je wellicht beter uitkijken naar alternatieven.

Wachtwoorden opslaan: Je wachwoord intypen

Let op: voor een pakket als WordPress lijkt het erop dat er veel problemen zijn, maar dat bij nadere inspectie deze problemen vooral lijken te ontstaan door plugins voor dit pakket. Kijk daarom ook goed uit welke plugins je installeert voor je website, want deze zijn over het algemeen minder goed gecontroleerd.

Zelf bouwen

Een ander verhaal wordt het als je zelf je inlogsysteem gaat bouwen. Er zijn bijzonder veel valkuilen in het opslaan van wachtwoorden. Als je een fout maakt, kan het zijn dat gebruikers niet meer in kunnen loggen, dat gebruikers in kunnen loggen als iemand anders, of erger nog, dat de wachtwoorden op straat komen te liggen.

Eén van de belangrijkste dingen die je moet doen, is het wachtwoord gehasht opslaan in je database, zodat een eventuele hacker niet zomaar achter het wachtwoord kan komen als hij toegang tot je database weet te verschaffen. In PHP heb je hier bijvoorbeeld de sha1-functie voor, waarmee je de SHA1-hash van het wachtwoord kunt berekenen. Verstandiger is om meteen te kiezen voor een ‘veilige’ hash als SHA256 (met “hash(‘sha256’,$invoer)”), maar ook dan ben je nog niet klaar; een ‘salt’ (een stukje willekeurige tekst om het omkeren van de hash moeilijker te maken) moet je nog steeds zelf berekenen en opslaan.

Wachtwoorden opslaan: Algoritme

Daarnaast is het erg belangrijk dat je je voorbereidt op sterkere hash-algoritmes. Computers worden steeds sterker en mensen zijn steeds bezig om bestaande algoritmes te kraken. Je moet je er dus op voorbereiden dat het door jou gebruikte algoritme eenvoudig vervangen kan worden. Bij wachtwoorden is dit echter lastig: je kunt niet zomaar je bestaande SHA1-database vervangen door een SHA256-database; je weet immers het oorspronkelijke wachtwoord niet.

Een methode om dat laatste op te lossen is om bij het wachtwoord op te slaan welk hash-algoritme is gebruikt. Als een gebruiker inlogt en je het gehashte wachtwoord uit de database haalt, weet je meteen hoe het ingevoerde wachtwoord gehasht moet worden. Bovendien weet je op dat moment het oorspronkelijke wachtwoord (want de gebruiker heeft dat ingevoerd), dus kun je meteen het wachtwoord opnieuw hashen met een beter algoritme als dat nodig is.

Niet opnieuw het wiel uitvinden

Op GitHub kun je een PHP-bestand vinden dat een groot deel van deze administratie al voor je doet. Dit bestand kun je bijvoorbeeld uploaden naar je website in de map ‘lib’, waarna je het in je eigen PHP-project in kunt laden met behulp van require. Als iemand een nieuw wachtwoord invoert (bijvoorbeeld bij het aanmaken van het account), kun je bijvoorbeeld dit gebruiken:

require 'lib/password.php';
$wachtwoord_alg = PASSWORD_DEFAULT; // = het beste algoritme
$wachtwoord_opt = array();

$wachtwoord = $_POST['wachtwoord'];

$hash = password_hash($wachtwoord, $wachtwoord_alg, $wachtwoord_opt);

if ($hash !=== false)

// Sla $hash op als het wachtwoord in je database

Zoals je ziet gebruiken we standaard het beste algoritme dat bekend is (zodat je systeem automatisch upgradet naar het beste algoritme als dit bekend wordt) en gebruiken we de password_hash-methode om het wachtwoord te hashen. Na de uitvoer van deze functie is het wachtwoord opgeslagen in een enkele variabele, maar zijn wel alle benodigde waarden in zijn opgeslagen: de hash, de salt en het gebruikte algoritme.

Om een gebruiker in te loggen op je website, kun je onderstaande code gebruiken:

$wachtwoord = $_POST['wachtwoord'];
$hash = ...; // Haal dit uit je database

if (password_verify($wachtwoord, $hash)) {
   if (password_needs_rehash($hash, $wachtwoord_alg, $wachtwoord_opt)) {
       $hash = password_hash($wachtwoord, $wachtwoord_alg, $wachtwoord_opt);
       if ($hash !== false) {
           // Sla het wachtwoord opnieuw op in je database
       }
   }
   echo "Wachtwoord is goed!";
} else {
   echo "Wachtwoord is fout!";

Met behulp van de functie password_needs_rehash controleren we of het wachtwoord momenteel nog veilig is. Zo niet, dan hashen we het wachtwoord opnieuw en slaan we de nieuwe hash op in de database.

Maar ik heb al een database met wachtwoorden!

Als je al een database met wachtwoorden hebt, dan is het zaak dat je deze bijwerkt naar het nieuwe formaat. Als je ze op dit moment zonder hash in je database hebt staan (foei!), is het upgraden makkelijk: met een tijdelijk script kun je eenmalig over alle wachtwoorden heen lussen, password_hash aanroepen en het nieuwe wachtwoord opslaan.

Gebruik je al een ander algoritme in je database, bijvoorbeeld MD5? Dan kun je twee dingen doen. Je kunt ervoor kiezen om alle wachtwoorden van alle gebruikers te herstellen en een manier te verzinnen waarop ze een nieuw wachtwoord ontvangen. Gebruiksvriendelijker is om in je inlogcode te kijken of het een oud wachtwoord betreft en je oude algoritme toepassen, waarna je het bijwerkt naar het nieuwe algoritme. Een uitgewerkt voorbeeld hiervan kun je vinden op Pastebin.

Moet ik dit wel doen?

De eerste vraag die je jezelf moet stellen voor je hieraan gaat beginnen is echter óf je dit wel zelf wílt doen. Je loopt onvermijdelijk tegen problemen aan; als giganten als Linkedin al fouten maken, dan zal jouw code ook niet foutenvrij blijven. Het veiligste inlogsysteem is géén inlogsysteem, maar met behulp van deze tips kun je al op een veilige en toekomstvaste manier wachtwoorden van jouw gebruikers opslaan.

Deel dit blog
Ralph Broenink
Ralph Broenink

Ralph Broenink is sinds begin 2008 werkzaam bij Antagonist. Hij begon op de support-afdeling, maar inmiddels is hij hoofd-ontwikkelaar van het systeem 'Mijn Antagonist'. Daarnaast studeert hij momenteel aan het Kerckhoffs Institute in de richting Computer Security.

Artikelen: 4

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Sterren Webhosting: 5 sterren uit 5.830 reviews

60.000+ webhostingpakketten actief
Bij de beste webhosters in MT1000 en Emerce 100