Taggat med: sha256

Så lagrar Dropbox ditt lösenord

Att Dropbox blev hackade och samtliga lösenord hamnade på vift 2012 är något som är välkänt. Av analys visade det sig att hälften av lösenorden var SHA1-hashade och andra hälften använde sig av bcrypt-hash. Detta troligtvis pga en pågående övergång från SHA1 till bcrypt.

Det har hänt en hel del sedan 2012 och Dropbox avslöjade nyligen hur de lagrar sina lösenord på ett säkert sätt.

Först och främst använder Dropbox precis som Facebook (se nedan) flertalet lager, som en lök. Att använda SHA512 före bcrypt är främst av två anledningar: överbelastningsattack om långa lösenord används samt att vissa implementationer av bcrypt kortar ner lösenordet till 72 bytes.

bcrypt används med en cost på 10 (arbetsfaktor/work factor) samt en unik salt för varje användare. Detta steg tar ungefär 100ms på Dropbox servrar.

Sista steget är AES256 med en global nyckel som är samma för alla hashar. Detta är för att om hela databasen blir snodd eller servern där lösenorden lagras så finns det ett extra skydd med en nyckel som är svår att hitta.

Dropbox lösenord

Även Facebook använder flertalet lager för sina lösenord (läs mer här):

Facebook lösenord

Dropbox har sedan tidigare utvecklat zxcvbn som ser till att användarna väljer bra lösenord först och främst. Även så kan vi anta att Dropbox kontinuerligt bevakar läckage av lösenord på nätet och informerar användare om just deras lösenord finns med eller går att knäcka.

Givetvis kan man alltid argumentera att det nu finns säkrare alternativ till bcrypt såsom argon2 och scrypt. Men bcrypt har bra stöd i många programbibliotek och har funnits ända sedan 1999. Dock uppger Dropbox att de har mer erfarenhet av bcrypt men kommer troligtvis att uppgradera till argon2.

Även uppger Dropbox att de kommer i framtiden att överväga att använda en HSM (kanske CrypTech?) för att lagra den globala nyckeln. Denna nyckel roteras också regelbundet uppger de på sin blogg.

Framtidssäkra krypteringen

Kryptoframtiden

Går det att sia in i framtiden om hur och vilka krypteringsalgoritmer som kommer att bestå?

Både Ja och Nej. Vi kan däremot titta i backspegeln och se vad vi har lärt oss av historien, vilka algoritmer som varit säkra och vilka som knäckts. För att jobba med krypton handlar om att alltid vara på tårna och följa vad som händer i omvärlden gällande nya rön, forskningsrapporter och best practices.

Det gäller att ha en plan för den dagen ett byte ska ske. Hur migrerar vi från SHA1 till SHA256? Kan vi byta hashfuktion på ett enkelt sätt eller blir vi kvar med MD5?

För de handlar inte enbart om att välja bra och trendiga algoritmer, det gäller även att bygga ett förtroende över tid.

Men skulle jag blicka framåt så är ChaCha20 + Poly1305 av Daniel J Bernstein (DJB), Peter Schwabe och Tanja Lange helt klart intressant som nu fått RFC-nummer 7539.

Så klart är elliptiska kurvor (ECC) intressant men titta innan framförallt på arbetet som DJB genomfört i samband med SafeCurves. Och när det gäller end-to-end kryptering så titta på axolotl (som nu WhatsApp använder).

krypto memeHåll Er borta från SHA1, 3DES, MD5 samt snake oil där utvecklare eller tillverkare skryter med löjligt stora nyckellängder eller oknäckbara system.

Och glöm framförallt inte att valet av algoritmer bara är en liten del av ett mycket större arbete som omfattar nyckelhantering, signering, kodgranskning, lökprincipen, patchning och uppsäkrade system och framförallt användare som ska använda systemet samt utbildas.

Så lagrar Facebook lösenord

På en konferens nyligen så avslöjade Facebook hur de lagrar sina lösenord. Eller rättare skrivet hur de hashar sina lösenord.

  1. $cur  = ’plaintext’
  2. $cur  = md5($cur)
  3. $salt = randbytes(20)
  4. $cur  = hmac_sha1($cur, $salt)
  5. $cur  = cryptoservice::hmac($cur)
  6.         [= hmac_sha256($cur, $secret)]
  7. $cur  = scrypt($cur, $salt)
  8. $cur  = hmac_sha256($cur, $salt)

1. Det första steget är tämligen självförklarande.

2. Gör först en MD5 av lösenordet. Detta ligger troligtvis kvar pga historia då detta troligtvis enbart var det enda steget. Om en användare loggar in och enbart har en md5 så kommer lösenordet att uppdateras med det nya systemet enligt nedan.

3. En salt på 160 bitar är genererad slumpmässigt. För att förhindra kollisioner så bör den vara minst 64 bitar pga antalet användare och övriga bitar är troligtvis för att framtidssäkra.

4. En HMAC med sha1 skapas som sedan skickas in i nästa steg.

5. Detta steg är för att inneha en central kontrolldel och att förhindra offline eller online forceringsattacker mot lösenord.

7-8. scrypt för att försvåra forcering samt skapande av regnbågstabeller. Vi har många gånger tidigare skrivit om scrypt. Samt sista steget är för att göra databasen med lösenord mindre.

Facebook håller även koll på lösenordsdumpar som publiceras på internet och förekommer ditt lösenord i en sådan dump så kommer Facebook att varna dig.

Bedömt så har Facebook lagt mycket kraft bakom lösenordshashningen och det ser mycket bra ut.

Joachim Strömbergson
Joachim Strömbergson

Joachim Strömbergson som är säkerhetsexpert på företaget Assured som också har tittat på Facebooks sätt att lagra lösenord kommenterar enligt följande:

För att sammanfatta min känsla efter 5 sekunder är att man är duktig och använder seed, man har till och med vad som ser ut att vara ytterligare en hemlighet vilket gör det än svårare att försöka göra regnbågsattacker. Vidare använder man dessutom scrypt för att införa work factor som försvårar uttömmande sökning.

Källa på informationen är det som Facebook uppgav vid konferensen Real World Crypt 2015.

Uppdatering: Per Thorsehim tipsar även om att Alec Muffett från Facebook höll en presentation vid konferensen Passwords 2014 i Norge där han berättar mer i detalj:

Facebook lösenord

Kryptering med PHP

PHP är ett mycket väl använt programmeringsspråk som används i samband med webb-programmering. Krypteringsfunktionerna i PHP kan delas upp i följande kategorier:

  • mcrypt
  • openssl
  • inbyggda

Här följer en mycket liten sammanställning av dessa tre kategorier:

mcrypt

Mcrypt som är ett tredjepartsbibliotek innefattar en mängd kryptering/dekrypterings-funktioner såsom:

Vill du exempelvis skapa en SHA256 hexsträng på godtycklig sträng kan du göra enligt följande:

$sha256b= base64_encode(bin2hex(mhash(MHASH_SHA256,$phrase)));

openssl

OpenSSL är också ett tredjepartsbibliotek och innefattar bl.a dessa funktioner:

De funktioner OpenSSL tillhandahåller i PHP är mer inriktade på assymetrisk kryptering.

inbyggda funktioner

Den mest använda krypteringsfunktionen i PHP är crypt() som stödjer följande krypteringsalgoritmer:

  • CRYPT_STD_DES – Standard DES-based encryption with a two character salt
  • CRYPT_EXT_DES – Extended DES-based encryption with a nine character salt
  • CRYPT_MD5 – MD5 encryption with a twelve character salt starting with $1$
  • CRYPT_BLOWFISH – Blowfish encryption with a sixteen character salt starting with $2$ or $2a$

Övriga kryptorelaterade funktioner som återfinns som standard i PHP är exempelvis sha1 och md5.