Projekt

Enkel inloggning (4/4)

2011-06-09 20:20 #0 av: [Fibbe]

I denna artikelserie kommer vi lära oss hur ett inloggningssystem fungerar. Denna inloggning kräver ingen databas! I del 4 kommer vi att titta lite på hur man krypterar lösenord. Detta kommer behövas när vi ansluter till databas senare.

Projektgång

Artikel 1: Inloggning för en medlem

Artikel 2: Inloggning för fler medlemmar

Artikel 3: Olika rättigheter till medlemmarna

Artikel 4: Kryptering av lösenord


Kryptering

Kryptering betyder att man förvränger information så att den ska bli svår eller omöjlig att läsa av. I vårt fall ska vi förvränga, kryptera, lösenord så att det inte går att läsa dessa.

 

Varför kryptera?

Om en hackare får tag på vårt lösenord och det inte är krypterat kommer hackaren att kunna logga in på vårt konto. Om det är krypterat på ett bra sätt kommer det bli väldigt svårt eller omöjligt för hackaren att använda det. Finns vårt lösenord i en php-fil finns egentligen ingen anledning att kryptera det. Kan hackaren se vår php-kod kan han förmodligen även ta sig in på vår hemsida utan lösenord.

När vi börjar spara våra lösenord på databas, det är då det blir kritiskt. Gör vi en miss då kan hackaren läsa av datan i databasen och även våra lösenord. Är de inte krypterade då är det bara att logga in på vilkens konto som helst.

 

Kryptering med avkryptering

Den första typen av kryptering fungerar så att vi med en speciell metod förvränger vår information så att den blir oläslig, sen kan vi göra processen baklänges för att göra den läslig igen.

Exempel, meddelande:

kryptering

Vi krypterar detta ord genom att förskjuta alla bokstäver ett steg frammåt.
Krypterat meddelande:

lszqufsjoh

Nu kan vi alltså inte läsa vårt meddelande. Men om vi avkrypterar det, genom att skjuta alla bokstäver ett steg bakåt kommer vi få tillbaka vårt meddelande igen.

 

Permanent kryptering/hash

Den andra typen av kryptering är en kryptering som inte går att avkryptera. Det är den här typen av kryptering vi kommer använda oss av! Vi kommer att använda oss av något som heter sha1 och redan finns inbyggt i php. Funktionen heter sha1().

Exempel, meddelande:

kryptering

Vi krypterar meddelandet med sha1:

3c6ff34869922803c24061b9377857c0e60d8dd0

Vi får alltså en lång sträng med siffror och bokstäver, kallas för hash. Detta meddelande går inte att avkryptera. Men hur ska man då veta vad man har för lösenord? Jo, det är faktiskt ganska enkelt! Vi kontrollerar helt enkelt om hash-koderna är lika istället för att kontrollera om själva lösenorden är lika.

Exempel:

$hash = "3c6ff34869922803c24061b9377857c0e60d8dd0";

if(sha1($password) == $hash)
{
echo "Rätt lösenord!";
}

Om variabeln $password är lika med "kryptering" i exemplet oven kommer vi få att lösenordet är rätt.

 

Bruteforce

Om någon skulle få tag på vårt hash kan dem alltså inte ta reda på vårt lösenord genom att avkryptera det. Däremot kan man testa att kryptera massvis med olika lösenord och se om dem får samma hash. Detta kallas bruteforce.

Exempel:

$hash = "3c6ff34869922803c24061b9377857c0e60d8dd0";

if(sha1("AAAA") == $hash)
{
echo "Lösenordet är AAAA";
}

if(sha1("AAAB") == $hash)
{
echo "Lösenordet är AAAB";
}
osv...

Det kan tänkas ta lång tid att göra så här, men det stämmer bara delvis. De nya programmen, så kallade crack-program, kan testa runt 400 miljoner lösenord i sekunden! Har man ett lösenord som enbart innehåller bokstäver och siffror tar det inte många sekunder innan hackaren har lösenordet.

 

Rainbow attack

Det är väldigt vanligt att man har ord eller namn som lösenord. Genom att göra en "brutefoce-attack" med alla ord från en gigantisk ordlista kan man enkelt knäcka dessa lösenord. När man använder ordlistor kallas det rainbow-attack. Men vi kan faktiskt motverka att hackare tar reda på våra lösenord ganska enkelt.

 

Lösning, använd salt

Lösningen till problemet är att använda säkra lösenord. Långa lösenord med små bokstäver, stora bokstäver, siffor och specialtecken så som: !"#¤%&/()=?@£$€{[]}\+?^~ osv... Men då får vi stora problem att komma ihåg lösenordet! Det är inte många som använder speciellt säkra lösenord och vi måste då som programmerare se till att det sker automatiskt. Detta görs genom att vi så kallat saltar våra lösenord.

Exempel:
Om användaren tar ett dåligt lösenord som till exempel pass kan ju faktiskt vi som programmerare lägga till massa specialtecken och andra tecken för att få detta lösenord säkert:

Exempel:

$salt1 = "aA!&7(?";
$salt2 = "12#ä-";
$pass = "pass";

$hash = sha1($salt1 . $pass . $salt2);

Det vi egentligen krypterar nu är:

aA!&7(?pass12#ä-

Det lösenordet är långt och innehåller alla olika typer av tecken och är då ett säkert lösenord. Men vi behöver bara komma ihåg lösenordet: pass. Att knäcka ett sådant lösenord skulle ta många år.

Ett annat tips är att använda användarnamnet som salt när man krypterar.

Exempel:

$salt1 = "aA!&7(?";
$salt2 = "12#ä-";
$user = "Felix";
$pass = "pass";

$hash = sha1($salt1 . $pass . $salt2 . $user);

Nu får vi ett längre och ännu säkrare lösenord! Man ska dock inte ta i för mycket då det tar längre tid att kryptera.

 

Funktion för kryptering

function pass_crypt($username, $password) {
$salt1 = "aA!&7(?";
$salt2 = "12#ä-";

return sha1($salt1 . $password . $salt2 . $username);
}

Vi kommer använda oss av denna funktion när vi senare ansluter vårt inloggningssystem till databas. Byt ut salten mot egna salt!

Mvh Felix

Intresserad av Php, MySQL eller övrig webbprogrammering?
Välkommen till webbprogrammering.ifokus.se

Anmäl
2013-01-03 23:21 #2 av: peped

Jag väntar ivrigt på anslutningen till databas.

Anmäl
2013-01-03 23:35 #3 av: MichaelE

Databaser är ett stort och tungt ämne, att lära sig grunderna kan förvisso vara lätt, men att lära sig att använda tabeller på ett korrekt sätt är något som både kräver tid och tålamod. Därav har ingen guide skrivits än eftersom vi inte är riktigt klara med hur den ska vara utformad.

Anmäl
2014-03-18 16:45 #4 av: bellajonna

Ett mycket bra exempel och script för hantering av inloggning till en webbsida. Men varianten att medlemmarna själva skapar sina inlogg och lösen som sen sparas på fil, och därtill en inloggningssida som kan lagra lösenordet som en sessionsvariabel, finns den upplagd någonstans?

// bellajonna

Anmäl
2014-03-18 19:22 #5 av: MichaelE

Tyvärr så finns det inga fler artiklar i ämnet.

Anmäl
2014-03-20 14:10 #6 av: bellajonna

I den här modellen är ju inlogg och lösenord förbestämda så kontrollen om rätt uppgifter är enkel.

//Rätt användarnamn och lösenord
$correct_user = "Admin";
$correct_pass = "test";

Men hur kan jag koda om jag inte vet dessa data utan behöver ett formulär för besökaren att registrera sig i?

// bellajonna




Anmäl

Det finns en till kommentar till den här diskussionen. Den är bara synlig för medlemmar på iFokus. För att läsa kommentaren, logga in eller registrera dig på iFokus.