Hash je wachtwoorden!

Afgelopen maand ontmoette ik een collega ontwikkelaar. Zij beweerde dat ze alles kan maken wat ze kan bedenken, en als demonstratie liet ze me haar app zien. Op zich een leuke app, het kon wel visueel wat extra’s hebben, maar toch. Ik ben ook geen grafisch artiest.

Om toegang te hebben tot alle functionaliteit van de app moest je een account aanmaken. Dat interesseert me dan wel weer. Ik ben voor verschillende projecten bezig met accounts, en ben constant in de weer om dat zo gemakkelijk en veilig mogelijk te maken voor zowel ontwikkelaars als gebruikers. Dus, ik ben gaan vragen naar de manier waarop die data verwerkt en opgeslagen wordt. Toen ik naar de wachtwoorden ging vragen kreeg ik echter een onverwacht antwoord: Die worden in onbewerkt opgeslagen.

When a website has complex password requirements, but sends it to you in plain text.
Sla nooit je wachtwoorden in plain text op.

Hier kan ik met mijn hoofd nog steeds niet bij. Waarom zou iemand een wachtwoord onbewerkt opslaan? De veiligheidsrisico’s die hierdoor ontstaan zijn gigantisch. Dit kan alleen maar gebeuren omdat je niet weet hoe je moet hashen, toch? Maar nee, ook dat was niet de oorzaak. Deze mevrouw heeft haar wachtwoorden bewust niet beveiligd, met als reden dat ze haar klanten dan beter kan helpen door op afstand in te loggen. Dan hoeft ze geen wachtwoord meer te vragen.

Dit vind ik echt niet kunnen. No way dat ik iemand vertrouw met mijn wachtwoord, daar is het mijn wachtwoord voor. Er hoeft maar één iemand in dat bedrijf te zijn met slechte intenties, en alle wachtwoorden staan zo op straat. En als je database onveilig is, kan zelfs iedereen erbij komen!

Door niet te hashen stel je het vertrouwen van je klanten enorm op de proef, in een tijd waar cybersecurity belangrijker dan ooit is. Ik kan me niet voorstellen dat iemand ooit nog gegevens bij dit bedrijf af wilt geven als ze weten hoe er hun gegevens omgegaan wordt.

Voor alle ontwikkelaars: Laat dit niet gebeuren. Hash je wachtwoorden altijd. Zorg ervoor dat hackers niks te pakken krijgen als het ze toch lukt om in te breken. En als je voor ondersteuningsredenen echt wilt kunnen inloggen op accounts van de gebruiker, bouw daar dan een aparte ingang voor. Ook dit raad ik af, maar het is beter dan niks. Hou deze ingang wel geheim, want kwaadwillenden kunnen deze ook gebruiken om accounts te verpesten en andere data te bemachtigen. Creditcardnummers e.d. zijn op deze manier ook niet veilig.

Mocht je nog niet weten hoe je wachtwoorden moet hashen? Dan staat hieronder PHP code als voorbeeld om je te laten zien hoe het werkt.

<?php

//Wachtwoord opslaan
$wachtwoord = "DitIsMijnWachtwoord!"; //Plain text wachtwoord, ingevuld door gebruiker
$wachtwoordHash = password_hash($wachtwoord, PASSWORD_DEFAULT); //Gehashte wachtwoord. Sla deze op in je database.

//Wachtwoord controleren
$wachtwoordGok = "IsDitMijnWachtwoord?"; //Plain text wachtwoord, ingevuld door gebruiker, misschien goed, misschien niet.
$wachtwoordHash = "Dit_is_een_wachtwoord_hash,_verkregen_uit_de_database."; //Hash van het echte wachtwoord van de gebruiker. Haal deze uit de database.
$wachtwoordJuist = password_verify($wachtwoordGok, $wachtwoordHash); //Controleer of het ingevulde wachtwoord goed is. Geeft een boolean terug.

?>

Meer dan dat is het niet. Nog steeds teveel? Momenteel ben ik bezig met een PHP framework om dit voor je te doen. Binnenkort ga ik daar over posten, maar er wordt nog aan gesleuteld.