Ik merk dat veel, vooral onervaren, programmeurs wachtwoorden vaak onveilig opslaan in een database. Daarom heb ik een tutorial met hoe je wachtwoorden behoorlijk veilig kan opslaan in een database door middel van een salt.
Wat is een salt?
Een salt is een extra random zin (string) die je achter iemand zijn wachtwoord plakt. Door dit te doen word het wachtwoord vrijwel identiek en kan deze o.a. niet worden 'gekraakt' door een Rainbow Table.
Hoe gebruik je een salt?
Een salt word dus gebruikt om achter iemand zijn wachtwoord te zetten. Deze salt word tijdens het registreren aangemaakt, achter het opgegeven wachtwoord gezet en dan gehasht door middel van een hash. Deze salt moet ook opgeslagen worden in de database, want steeds als de gebruiker na het registreren wil inloggen geeft deze zijn normale niet gehashte en gesalte wachtwoord op. Als de persoon dus inlogt word zijn gehashte + gesalte wachtwoord uit de database opgehaald, de salt die is opgehaald vanuit de database word achter het opgegeven wachtwoord geplakt, dan word het opgegeven wachtwoord met de salt weer gehasht en als laatste word gekeken of deze 2 wachtwoorden overeenkomen. Komen deze wachtwoorden overheen dat word de gebruiker natuurlijk ingelogd. Zo niet kan je een fout melding geven dat de gebruikers gegevens onbekend zijn.
Voorbeeld
Ik heb een class gemaakt die wachtwoorden een salt geeft en daarna meteen hasht met sha256.
Eerste moeten we de database gegevens specificeren op regel 11 t/m 15 van de class. Hier moet je je database host, user, pass en naam + de tabel rij van de gebruikers neer zetten.
Daarna beginnen we met het includen van de class en het aanmaken van de instance.
Nu kunnen we beginnen met het beveiligen van de wachtwoorden.
We hebben een mooie site gemaakt en onze eerste gebruiker genaamd piet komt zich aanmelden op onze site. Hij vult alles velden netjes in hij gebruikt de username "piet" en zijn wachtwoord is "geweldigePiet3". Nu moeten wij zijn wachtwoord beveiligen. Dit doen we door de functie generateHashSalt($password) te gebruiken.
Deze functie keert een array terug met het gehashte + gesalte wachtwoord en de salt. Hier de variabele dump van piet zijn nieuwe wachtwoord en salt ($safePass).
Het wachtwoord en salt moeten nu nog wel handmatig in de database opgeslagen worden, dit doet de class (nog) niet. Hier wil ik misschien later opties voor maken dat je kan kiezen of de functie ook meteen het wachtwoord zelf opslaat.
Piet heeft zijn account geactiveerd en probeert in te loggen op onze website. Nu moeten wij controleren of hij zijn juiste wachtwoord heeft ingevoerd. Hier voor gebruiken we de functie checkUserPass($user, $password). Hier kan $user 2 waardes hebben: waarde 1 is de id van de gebruiker (int) of waarde 2 de username van de gebruiker (string). De functie controleert automatisch of het een int is, dus een id of een naam. Daarna gaat hij kijken of deze user bestaat in de database. Zo ja controleert hij of het wachtwoord overeenkomt en keert "true" terug, zo nee keer de functie "false" terug.
De gegevens van onze Piet kloppen dus hij is nu ingelogd!
Noot:
De gebruikers tabel moet deze 4 rijen hebben (dit geldt niet als je de rij namen in de code veranderd) :
Ik hoop dat je er wat aan deze uitleg gehad hebt. Feedback is altijd welkom!
Wat is een salt?
Een salt is een extra random zin (string) die je achter iemand zijn wachtwoord plakt. Door dit te doen word het wachtwoord vrijwel identiek en kan deze o.a. niet worden 'gekraakt' door een Rainbow Table.
Hoe gebruik je een salt?
Een salt word dus gebruikt om achter iemand zijn wachtwoord te zetten. Deze salt word tijdens het registreren aangemaakt, achter het opgegeven wachtwoord gezet en dan gehasht door middel van een hash. Deze salt moet ook opgeslagen worden in de database, want steeds als de gebruiker na het registreren wil inloggen geeft deze zijn normale niet gehashte en gesalte wachtwoord op. Als de persoon dus inlogt word zijn gehashte + gesalte wachtwoord uit de database opgehaald, de salt die is opgehaald vanuit de database word achter het opgegeven wachtwoord geplakt, dan word het opgegeven wachtwoord met de salt weer gehasht en als laatste word gekeken of deze 2 wachtwoorden overeenkomen. Komen deze wachtwoorden overheen dat word de gebruiker natuurlijk ingelogd. Zo niet kan je een fout melding geven dat de gebruikers gegevens onbekend zijn.
Voorbeeld
Ik heb een class gemaakt die wachtwoorden een salt geeft en daarna meteen hasht met sha256.
Eerste moeten we de database gegevens specificeren op regel 11 t/m 15 van de class. Hier moet je je database host, user, pass en naam + de tabel rij van de gebruikers neer zetten.
Daarna beginnen we met het includen van de class en het aanmaken van de instance.
Nu kunnen we beginnen met het beveiligen van de wachtwoorden.
We hebben een mooie site gemaakt en onze eerste gebruiker genaamd piet komt zich aanmelden op onze site. Hij vult alles velden netjes in hij gebruikt de username "piet" en zijn wachtwoord is "geweldigePiet3". Nu moeten wij zijn wachtwoord beveiligen. Dit doen we door de functie generateHashSalt($password) te gebruiken.
Deze functie keert een array terug met het gehashte + gesalte wachtwoord en de salt. Hier de variabele dump van piet zijn nieuwe wachtwoord en salt ($safePass).
Het wachtwoord en salt moeten nu nog wel handmatig in de database opgeslagen worden, dit doet de class (nog) niet. Hier wil ik misschien later opties voor maken dat je kan kiezen of de functie ook meteen het wachtwoord zelf opslaat.
Piet heeft zijn account geactiveerd en probeert in te loggen op onze website. Nu moeten wij controleren of hij zijn juiste wachtwoord heeft ingevoerd. Hier voor gebruiken we de functie checkUserPass($user, $password). Hier kan $user 2 waardes hebben: waarde 1 is de id van de gebruiker (int) of waarde 2 de username van de gebruiker (string). De functie controleert automatisch of het een int is, dus een id of een naam. Daarna gaat hij kijken of deze user bestaat in de database. Zo ja controleert hij of het wachtwoord overeenkomt en keert "true" terug, zo nee keer de functie "false" terug.
De gegevens van onze Piet kloppen dus hij is nu ingelogd!
Noot:
De gebruikers tabel moet deze 4 rijen hebben (dit geldt niet als je de rij namen in de code veranderd) :
- `id` INT 11
- `username` VARCHAR 30 (lengte eigen keuze)
- `password` VARCHAR 64
- `usersalt` VARCHAR 8 (tenzij lengte van salt word veranderd op lijn 49)
Ik hoop dat je er wat aan deze uitleg gehad hebt. Feedback is altijd welkom!
Met vriendelijke groet,
Dees
Dees
4,540 times read
Victor -
@FangorN Ik doelde inderdaad op een User class die in principe elke willekeurige gebruiker zou kunnen zijn.
Mijn vraag is dan wel waarom je een User class zou willen maken van de actuele (dan al niet geauthenticeerde) gebruiker van het systeem? Dat zou je in principe toch op kunnen nemen in de iedereen overkoepelende User class?