De afgelopen tijd heb ik meegelezen in [PHP] Sessie beveiliging en salts over het gebruik van salts en hoe je het beste de wachtwoorden opslaat in je database.
Op dit moment gebruik ik nog geen salts, maar wil hier wel mee beginnen.
Mijn inlog systeem is gebaseerd op een uitleg van crisp:
Daarna stuur ik geen plain wachtwoord over de lijn vanaf de client, maar het volgende dmv JS:
Server-side wordt de response ook gegenereerd en vergeleken. Is dit een match dan wordt je ingelogd.
Het probleem is nu dat als ik het wachtwoord met een global salt én een user-specifieke salt opsla in de database ik die 'challenge' niet meer clientside kan genereren waardoor deze opzet niet meer werkt.
Hoe kan ik nu beide techieken combineren?
Op dit moment gebruik ik nog geen salts, maar wil hier wel mee beginnen.
Mijn inlog systeem is gebaseerd op een uitleg van crisp:
Bij het openen van de login pagina wordt een sessionid gemaakt die een TTL van 10 minuten heeft.Stap 1) Genereer een sessieid en sla die op in je sessietabel met userid = 0
Stap 2) Neem deze sessieid op in een hidden veld in je formulier als challenge
Stap 3) Gebruiker vult gebruikersnaam en wachtwoord in
Stap 4) Genereer een response dmv md5(md5(wachtwoord) + gebruikersnaam + sessieid)
Stap 5) Stuur username, sessieid en response terug (+ eventuele andere opties)
Stap 6) Controleer of de sessieid voorkomt in je sessietabel, de TTD niet verstreken is en deze toebehoort aan userid 0 (geen user)
Stap 7) Controleer of de gebruikersnaam bestaat in je DB
Stap Zo ja, haal zijn md5'ed wachtwoord op uit je database
Stap 9) Genereer ook serverside de md5(md5'ed wachtwoord + gebruikersnaam + sessieid)
Stap 10) Vergelijk dit resultaat met de response van de client
Stap 11) Indien matched: gooi oorspronkelijke sessieid weg
Stap 12) Genereer een nieuwe sessieid en sla die op in je sessietabel met het juiste userid (+ andere opties)
Stap 13) Stuur een cookie met het nieuwe sessieid daarin
Daarna stuur ik geen plain wachtwoord over de lijn vanaf de client, maar het volgende dmv JS:
PHP:
1
| $enc_challenge = SHA1(enc_password + username + sessionid) |
Server-side wordt de response ook gegenereerd en vergeleken. Is dit een match dan wordt je ingelogd.
Het probleem is nu dat als ik het wachtwoord met een global salt én een user-specifieke salt opsla in de database ik die 'challenge' niet meer clientside kan genereren waardoor deze opzet niet meer werkt.
Hoe kan ik nu beide techieken combineren?