password••••••••Argon2id+salt + cost$argon2id$v=19$m=...$Tk7e...slow, memory-hard, one-way

Lösenordshasning

11 min lästKryptografi

Att lagra användarlösenord är en av de värsta möjliga sakerna du kan göra i klartext, och ett av de vanligaste säkerhetsmisstagen. Fixningen har funnits i decennier – lösenordshashing med långsamma, minneshårda algoritmer – men skillnaden mellan bra och dåliga implementeringar är enorm, och de flesta dataintrång avslöjar dåliga val.

Hela artikeltexten finns på engelska nedan.

Password hashing är praxis att lagra en enkelriktad transformation av en användares lösenord istället för själva lösenordet. När användaren loggar in, tillämpas samma transformation på deras indata och jämförs med det lagrade värdet. Om den lagrade databasen bryts har angriparen hash, inte lösenord — och det borde vara beräkningsmässigt omöjligt att återställa originalen.

Tdet är teorin. Övningen sträcker sig från "fungerar som annonserat" till "kan lika gärna ha varit klartext", beroende på vilken algoritm och parametrar som valdes.

Vad en bra lösenordshash behöver

  • Envägs. Att känna till hashen borde inte avslöja något användbart om lösenord.
  • Salted. Varje användare har ett unikt slumpmässigt salt blandat i hashen. Förhindrar förberäknade regnbågstabeller och säkerställer att identiska lösenord producerar olika hash.
  • Slow. En enda hashberäkning bör ta en meningsfull bråkdel av en sekund på angriparens hårdvara. Brute-force med miljarder per sekund är vad som besegrar snabba hash.
  • Memory-hard. Varje hash bör kräva betydande RAM, besegra GPU och ASIC-parallellisering som frodas på små per-instans-minne.
  • Future bör vara kostnadssäker faktor26XFuture. uppåt i takt med att hårdvaran blir snabbare.

Fel val

Algorithmer du aldrig får använda för lösenordslagring:

  • MD5. Kryptografiskt bruten sedan 2004. Bruteshes-forces of consumers per seconds of consumer. hardware.
  • SHA-1, SHA-256. Snabba kryptografiska hash designade för integritetskontroll, inte lösenordslagring. Brute-forceable med miljarder per sekund på GPUs.
  • Krypterade lösenord. Om du kan dekryptera dem tillbaka till klartext, kan en angripare som stjäl nyckeln också. Hashing är svaret; kryptering är inte.
  • Plaintext. händer fortfarande 2026. Varje oformaterad lösenordsöverträdelse kan förebyggas.

De rätta valen

De tre moderna rekommenderade Algoritmer:

  • bcrypt (1999). Justerbar kostnadsfaktor (beräkningsomgångar). Begränsat till 72-byte lösenord. Inte minnessvårt, så GPU:er kan attackera det effektivt - men en rimlig kostnadsfaktor gör attacker dyra. Bred distribution, enkel att använda korrekt.
  • scrypt (2009). Minneshård. Konfigurerbar minneskostnad, parallellitet och CPU-kostnad. Mer komplex än bcrypt; ibland felkonfigurerad.
  • Argon2 (vinnare i Password Hashing Competition 2015). Tre varianter: Argon2d (databeroende, resistent mot GPU-attacker men sårbar för sidokanaler), Argon2i (dataoberoende, sidokanalsresistent), Argon2id (hybrid – rekommenderad standard). Modernt, väl genomtänkt, det rätta valet för nya system.

OWASP rekommenderar för närvarande Argon2id med minst 19 MB minne, iterationsantal på 2 och parallellism på 1. För system där Argon2 inte är tillgängligt, bcrypt med kostnad ≥ 10 eller scrypt som är godtagbar med lämpliga fallback-parametrar 7PLZWhat2XWh. "långsam" betyder i praktiken

Kostnadsfaktor på 10 i bcrypt betyder ungefär 100 ms per hash på modern hårdvara. För en legitim användare som loggar in är detta omärkligt. För en angripare som försöker brutalt tvinga fram 100 miljoner lösenord från en läckt databas är det 100 miljoner × 100 ms = 116 dagars GPU-tid per pass genom en rimlig ordlista. Kombinerat med ett unikt salt per användare är stora regnbågsbord värdelösa.

För en snabb hash som osaltad SHA-256 tar samma operation några minuter på samma hårdvara.

Salthantering

  • Salt genereras av en användare, av en användare, skapande
  • 16 byte räcker (128 bitars slumpmässighet)
  • Salt lagras bredvid hashen, inte hemligt – dess uppgift är att vara unik, inte dold
  • De flesta moderna hashbibliotek (bcrypt, Argon2) har enstaka algorith-utdata i PHC-algorith-format, bundle astring, bundle string

Pepper: valfri extra

A pepper är ett webbplatsomfattande hemligt värde som läggs till hash-ingången och lagras separat från databasen (i ett HSM-, nyckelvalv eller appkonfiguration). Om databasen dumpas men paprikan inte är det, kan hash inte återställas även med användarsaltet – eftersom angriparen inte har pepparn. Pepper är ett användbart tillskott av bälte och hängslen för högvärdiga system.

Uppgradera hash säkert

När du ändrar parametrar eller migrerar algoritmer kan du inte hasha om utan det ursprungliga lösenordet. Standardmetoden:

  1. Varje användarpost lagrar sin nuvarande hashalgoritm, parametrar, salt och hash.
  2. Vid inloggning, verifiera mot den lagrade hashen med dess ursprungliga parametrar.
  3. Om verifieringen lyckas och parametrarna är inaktuella med nuvarande parametrar och uppdaterar de aktuella parametrarna. record.

Inom några månader av aktiva användare övergår databasen till nya parametrar utan att tvinga fram lösenordsåterställningar.

Vad detta betyder för användare

För slutanvändare, den praktiska effekten: även när en databas kränks, har ett starkt unikt lösenord plus ett bra lösenord (hanteras av ett XXLZ16PLZ1). server betyder att lösenordet förblir effektivt hemligt. Svaga lösenord knäcks även från välhashade databaser; användaren är variabeln som en utvecklare inte kan kontrollera.

Vanliga frågor

Varför är bcrypt begränsad till 72 tecken?
Historisk implementeringsdetalj av det underliggande Blowfish-chifferet. Längre ingångar trunkeras. De flesta användare märker inte; en slumpmässig lösenfras på 16 tecken är långt under gränsen. För system som vill ha obegränsad lösenordslängd har Argon2 ingen sådan begränsning.
Ska jag salta och peppra mina lösenord?
Salt krävs (och alla välrenommerade bibliotek gör det automatiskt). Pepper är valfritt men värdefullt för högsäkerhetssystem. Avvägningen: att hantera paprikan som en långsiktig hemlighet utanför databasen ger operativ komplexitet. De flesta appar lagrar salt + hash; de största lagrar salt + hash + pepparhärledd hash.
Är Argon2 alltid bättre än bcrypt?
För nya system, ja. Argon2 är minneshård (resistent mot GPU/ASIC), har ingen gräns på 72 tecken och vann Password Hashing Competition av goda skäl. bcrypt är fortfarande acceptabelt när Argon2 inte är tillgängligt eller organisatoriska begränsningar föredrar den äldre standarden. För äldre system som använder bcrypt med kostnad ≥ 10, är ​​brådskan att migrera låg.
Hur lång tid bör det ta att hasha ett lösenord?
OWASP föreslår cirka 100-500 ms på serverns hårdvara. Snabbare betyder svagare mot angripare; långsammare börjar påverka legitim inloggningsupplevelse. Rätt antal beror på din trafik — tjänster med hög volym väljer lägre kostnad; högsäkerhetstjänster med låga inloggningshastigheter kan välja högre.
Kan jag lagra lösenord krypterade istället för hashade?
Gör det inte. Kryptering är reversibel, vilket innebär att krypteringsnyckeln måste finnas någonstans som applikationen kan komma åt. Om databasen bryts är nyckeln ofta det också, och du har effektivt lagrat klartext. Hashings oåterkallelighet är poängen — även din egen applikation kan inte återställa lösenordet, som är säkerhetsegenskapen.
Lösenordshashing förklaras: Varför bcrypt, scrypt och Argon2 spelar roll