När man pratar om lösenord så brukar man säga att det är användarens skyldighet att välja ett långt och säkert lösenord, och det är helt sant, till viss del. Men du som utvecklare har också ett stort ansvar i det hela, du måste se till att lösenorden sparas i databasen på ett säkert sätt. Om någon utomstående skulle lyckas ta sig in i din databas så vore det rena rama julafton för honom/henne om alla lösenord är sparade i klartext. Det är väldigt viktigt att du på något sätt krypterar sparade lösenord, och i den här artikeln har jag tänkt att gå igenom ett effektivt sätt.
Att tänka på: Även om din sida inte är så populär och det inte gör så mycket om databasen blir stulen så kan dina medlemmar ha samma lösenord på andra sidor, som är betydligt viktigare. Ge dina besökare den säkerhet de förtjänar.
Kryptering har funnits sedan urminnes tider och innebär att man döljer ett meddelande för obehöriga läsare, och det är ju precis så vi vill ha det med våra lösenord, eller hur? Hur ska vi då bära oss åt för att få ett så optimalt skydd som möjligt? Jo, det finns många olika krypteringsmetoder, men de flesta går på något sätt att dekryptera.
Men det finns också så kallade envägskrypteringar, som bara går att kryptera och inte dekryptera, det är en sådan kryptering vi ska använda oss av. Vi ska använda oss av en envägskryptering som kallas MD5, i PHP som vi kommer att använda oss av i den här artikeln finns funktionen inbyggd som
md5()
MD5 är, som sagt, en envägskryptering, eller hash-funktion som det egentligen heter. För att beskriva en hash-funktion på ett enkelt sätt så kan du tänka dig att vi ska kryptera sifferkoden 12345. Vi adderar ihop alla tal i koden: 1 + 2 + 3 + 4 + 5 = 15. Nu har vi fått "hash-summan" 15 genom lite enkel matematik. Men det är inte lika enkelt att gå åt andra hållet. Vi kan inte utgå från summan 15 och lista ut vilka tal vi adderade för att komma fram till 15.
Okej, då sätter vi igång med det praktiska. Vi tänker oss en registreringssida där besökarna ska välja ett lösenord. Du hämtar lösenordet som vanligt och sparar det i en variabel. Men innan du sparar lösenordet i databasen måste du köra den genom MD5-funktionen.
<?php$password = $_POST['password'];$md5_password = md5($password);// Spara $md5_password i databasen?>
Nu kommer det hashade lösenordet att sparas i databasen. Inte så svårt, eller hur? Bra! Men hur ska vi nu bära oss åt när vi ska kontrollera om det är rätt lösenord vid inloggningen? Ta det lugnt, det är inte svårt alls. Vi gör bara samma sak igen. Vi hämtar lösenordet som användaren skriver in, kör det genom MD5-funktionen och kollar sedan om det är detsamma som det sparade hash-värdet i databasen.
Nu är lösenorden bra mycket säkrare, men de går faktiskt fortfarande att knäcka. Men vadå? Jag sa ju att det inte gick att dekryptera hashade lösenord. Det är helt sant, det går inte. Men det finns personer som har samlat på sig stora listor med hashade ord. Dessa listor innehåller miljontals ord och teckenföljder. Med hjälp av dessa ordlistor kan hackare jämföra dina lösenordshashar med hasharna i ordlistan, och på så sätt hitta rätt lösenord.
För att skydda lösenordet ytterligare måste vi därför använda oss av något som kallas salt. Att "salta" ett lösenord innebär att man lägger till några slumpade tecken före och/eller efter lösenordet innan man kör det genom MD5-funktionen. På så sätt är det nästintill omöjligt för hackarna att hitta lösenordshashen i en ordlista. Här är en metod för att salta ett lösenord:
<?php$password = $_POST['password'];$salt1 = "18gI%f5A";$salt2 = "@Y4p91bN";$salt_password = md5($salt1.$password.$salt2);// Spara $salt_password i databasen?>
Om en användare nu skulle valt att använda, till exempel, "internet" som lösenord, som vanligen skulle finnas med i en ordlista, skulle "ordet" 18gI%f5Ainternet@Y4p91bN köras genom MD5-funktionen istället och sparas i databasen. Självklart måste man lägga till salt-nycklarna när man ska kontrollera lösenorden vid inloggning också.
Det var allt för mig, hoppas du har lärt dig någonting. Kom ihåg att ALDRIG, ALDRIG, ALDIG spara ett lösenord i klartext.
Skribent: Emil Friskhttp://www.w3sidan.net/profil/frisko
Var innehållet i den här artikeln användbar? Har du några övriga kommentarer?
Hur mycket gillade du den här artikeln? Ju fler hjärtan desto bättre.