På kort tid har flera stora svenska sajter hackats och lösenord kommit på drift. Listor har publicerats med både lösenord i klartext och checksummor, bakom vilka ett lösenord döljer sig.

Ingen sajt som är någorlunda säkerhetsmedveten skulle få för sig att lagra användarnas lösenord i klartext. Skulle databasen komma på drift, eller en angripare lyckas injicera elak sql-kod, har din sajt plötsligt förvandlats till ett såll och du kan lita på att dina kunder inte vill ha mer med dig att göra.

Hasha och salta lösendordet
Det vanligaste sättet att lagra lösenord på ett säkert vis är att lagra dem som en checksumma skapad av en hash-algoritm. Exempel på algortimer är sha1, sha256 och md5. En hash-algoritm tar ditt lösenord i klartext och skapar en unik checksumma. Är vårt lösenord "password" blir md5-summan som lagras i databasen 286755fad04869ca523320acce0dc6a4. Vid varje inloggning tar systemet sedan vårt lösenord, utför exakt samma hash-operation och ser om checksumman stämmer mot den som finns lagrad i databasen.

Algoritmen kan förbättras genom att "salta" lösenordet med en textsträng som läggs till före eller efter ditt lösenord. Om vi exempelvis saltar vårt "password" genom att lägga till "techworld" före så blir checksumman plötsligt 112bd0dcc32508379a9cdb716da7d353. Känner däremot hackaren till vårt salt, exempelvis om han fått tillgång till koden för att hantera inloggning, så blir det enklare att knäcka.

Så snabbt knäcks checksumman
Att lyckas knäcka en checksumma är främst en fråga om hur mycket tid och pengar någon är villig att lägga ut. Tur kan spela en viss roll också. Vi har också fått lära oss att blanda in både siffror, stora och små bokstäver och specialtecken för att försvåra för hackaren.


Om du har ett lösenord på åtta bokstäver blandat siffror, stora och små bokstäver så kan en superdator knäcka det på 60 timmar.

Som exempel kan vi tala om att checksumman bakom vårt osaltade lösenord "password" tar max tre minuter att knäcka för någon med de rätta resurserna. Ett mer komplicerat lösenord som Mind2pE kan knäcknas på under en timme.

Någonstans blir användarvänligheten lidande. Det är inte kul för en användare att varje månad behöva byta lösenord till något nytt obegripligt lösenord på tjugo tecken. Problemet bottnar i att de hash-algrotimer som används, sha1, sha256 och md5, är alldeles för effektiva. Algoritmerna är utformade för att skapa en unik summa och skapa den snabbt.

Långsam algoritm ger hög säkerhet
Ett betydligt bättre alternativ för att skapa en lösenordshash är att använda algoritmen Bcrypt. Om md5 är gjord för att vara så snabb som möjligt så är bcrypt gjord för att vara så slö som möjligt. En fördel är att du själv kan lägga på ett kostnadsvärde som påverkar hur lång tid det tar att skapa en hash. Om du exempelvis skapar ett lösenord med kostnadsvärde 12 så tar bcrypt 100 000 gånger så lång tid på sig att beräkna checksumman än md5. Lång tid kan tyckas men med tanke på hur snabba dagens datorer är så går det ändå på under en sekund. En väldigt låg kostnad med tanke på hur pass mycket säkrare lösenordet blir.


Distributionen Openbsd använder bcrypt vilket du kan se i lösenordsfilen. Längst ned ser du att lösenordet för användaren nandersson är krypterat med Bcrypt.

En positiv effekt med bcrypt är att du inte behöver tvinga användarna till att sätta onormalt långa eller krångliga lösenord. Visst, det går fortfarande att gissa sig till men att låta superdatorer knäcka lösenordet blir i det närmaste meningslöst. En hash skapad med bcrypt ser ut så här $2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu. Texten $2a$ talar om vilken algoritm som används $10$ talar om kostnaden som är tio och därefter följer checksumman på 54 tecken.

För Webbutvecklare som vill använda bcrypt för att lagra sina lösenord finns färdiga bibliotek både för Java, php och Python.

TechWorlds slutsats:
Bcrypt är ett betydligt säkrare sätt att kryptera lösenord på men vi skulle gärna se bättre verktyg. Både på kommandoraden, webbspråken och i våra databaser. Trots många år på nacken är tekniken okänd.