Regelmatig lees je in de krant of op het internet dat wachtwoorden van internet gebruikers op straat liggen, en dat terwijl makers van website dit op een eenvoudige manier kunnen voorkomen. Kom erachter hoe je diefstal van wachtwoorden kan voorkomen door deze blog te lezen!
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$Se3mLsHueAYTM3G4Wd9hTuyfzPCRYtafImcOSO2U0H4290jPU.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.
Trainingen PHP
Wist je dat Learnit diverse trainingen in PHP aanbiedt? Tijdens onze training PHP Programmeren Basis helpt jou een stuk vooruit in de wereld van PHP met behulp van praktische voorbeelden. In de training PHP Programmeren Vervolg brengen we jouw PHP programmeervaardigheden naar een hoger niveau waarbij je een professionele programmeerstijl krijgt en alle technieken die nodig zijn voor een volwassen webaplicatie leert. Klik hier voor het gehele overzicht in PHP trainingen van Learnit.