Databashantering‎ > ‎php‎ > ‎

lagra lösenord i en databas

När man gör ett system där flera användare ska kunna logga in är det vanligt att man lagrar deras lösenord i databasen.
Det kan se ut ungefär så här:
SELECT id, username, password FROM users;
+---+---------+---------+
|id |username |password |
+---+---------+---------+
|1  |homer    |abc123   |
|2  |superman |Kent     |
|3  |batman   |adamwest |
|4  |indiana  |jones    |
|5  |macgyver |#d¤5L9§9 |
+---+---------+---------+


Problemet med att hantera lösenord så här är att det händer att obehöriga kan få tag i vår databas som ligger lagrade i klartext vilket är väldigt allvarligt.
Se t.ex:
http://www.idg.se/2.1085/1.140298 "Efterfesten.com hackades - hundratusentals lösenord i spridning"

Så för att lagra lösenord måste vi undvika att lagra lösenord i klartext och detta kan vi åstadkomma genom att använda en haschfunktion.
Om vi antar att vi använder hash-funktionen MD5 blir md5-summan för följande text detta:

 klartext md5(klartext)
 abc123    e99a18c428cb38d5f260853678922e03
 qwertyd8578edf8458ce06fbc5bb76a58c5ca4
 bananaec7bd708ed2ad3435b9a9883ac7f45c
 krankelibrankelfnatt 
346b7d31ea9741342c0964435ae59c3f
 a0cc175b9c0f1b6a831c399e269772661

hash-funktioner har den egenskap att det inte går räkna ut vilken text som matades in för att skapa haschsumman.
Det har givetvis skapats register på vilka enklare stängkombinationer som motsvarar vilken summa.
Testa göra en googlesökning på e99a18c428cb38d5f260853678922e03 och du kommer genast se att det är väldigt välkänt att detta är just abc123.
Så detta är inget direkt skydd utan något som fördröjer tiden det tar att kunna använda lösenorden som den elaka personen har fått tag på.
Detta hände bland annat 2008 med bilddagbokens användardatabas (http://www.idg.se/2.1085/1.139967).

md5 är givetvis inte den enda haschfunktionen (för en lite mer detaljerad lista se: http://en.wikipedia.org/wiki/Cryptographic_hash_function#List_of_cryptographic_hash_functions)
Vi kommer i fortsättningen dra

Så för att göra det ännu svårare för de som har fått tag på lösenordet kan man använda sig av ett salt före man kör lösenordet genom en haschfunktion.
Man brukar där definiera en unik sträng för din sida som skickas med in i funktionen:
lösenordhasch = haschfunktion(lösenordiklartext + salt)
På det viset så kommer alla lagrade lösenordshasch bli unika för just din databas. Vi kan dock göra ännu ett tillägg för att se till att försvåra genom att lägga till data som är konstant för varje post i användartabellen.
lösenordhasch = haschfunktion(lösenordiklartext + salt +användarid)


Comments