Vad gör ett lagringsformat återställningsbart
Fyra lagringsformat, rangordnade efter återställningsbarhet:
| Format | Återställningsbart? | Exempel | Återställningsmetod |
|---|---|---|---|
| Klartext | Ja | password: hunter2 | Läs filen |
| Base64 | Ja | cGFzc3dvcmQ= | base64 --decode |
| Reversibel chiffer (AES) | Ja | ENC[AES256:...] | Dekryptera med nyckel |
| Envägshash (bcrypt) | Nej | $2b$12$... | Kan inte återställas; måste brute-force |
Klartext, base64 och reversibel chiffer: alla återställningsbara. En enda dump av en autentiseringsdatabas ger en angripare alla lösenord i klartext, för alla användare, samtidigt. Ett intrång; total exponering.
Exemplet med Mailman 2.x
Mailman 2.x (GNU:s e-postlistshanterare): lagrade prenumeranternas lösenord i klartext. Månatligt e-postmeddelande med lösenordspåminnelse: skickade alla prenumeranter deras lösenord i klartext. Två separata brister, båda MOAD-0006:
1. Lagring: klartext i listdatabasen. En serverkompromiss exponerar alla prenumeranters lösenord.
2. Sändning: månatligt e-postmeddelande skickar lösenordet i klartext över SMTP till prenumerantens e-postserver. E-post färdas i klartext över flera SMTP-hopp.
Mailman-teamet designade båda beteendena. Återställning var funktionen: prenumeranter kunde hämta glömda lösenord. Namnet Glass Safe kommer från detta: kassaskåpet förvarar inloggningsuppgifter i synlig form. Alla som når kassaskåpet kan läsa allt innehåll samtidigt.
The Already-Stolen Principle
En inloggningsuppgift som lagras i återställningsbar form är en inloggningsuppgift som redan är stulen. Angriparen har inte kommit än. Intrånget har inte inträffat än. Men arkitekturen garanterar: när ett intrång sker, faller alla inloggningsuppgifter samtidigt. Inget intrång sker isolerat; varje inloggningsuppgift i återställningsbar lagring överförs till angriparen i samma operation.
MOAD-0006 vs MOAD-0004
MOAD-0004 (Logged Secret): inloggningsuppgifter som skrivs till loggar av misstag. Loggskrivningen var inte avsikten; det var en bieffekt av att aktivera header-loggning för felsökning.
MOAD-0006 (Glass Safe): inloggningsuppgifter lagrade i återställningsbar form med avsikt. Återställning var avsikten. Funktionerna för lösenordspåminnelse krävde att lösenordet lagrades. Funktionerna för att visa lösenord krävde att det lagrades. Den arkitektoniska åtagandet till återställning skapade defekten.
Enradig distinktion: MOAD-0004 placerar inloggningsuppgifter i loggar av misstag; MOAD-0006 lagrar inloggningsuppgifter i återställningsbar form med avsikt. Åtgärderna verkar på olika lager.
Structural vs Accidental
Den arkitektoniska skillnaden mellan MOAD-0006 och MOAD-0004 avgör fix-strategin. En oavsiktlig loggskrivning: åtgärda serialiseringslagret. En lagringslösning som är designad för återställning: omdesigna funktionen som krävde återställning.
Varför bcrypt fungerar
En envägshashfunktion tar emot ett lösenord och producerar en digest med fast längd. Givet digesten kan det ursprungliga lösenordet inte återställas. Inte "svårt att återställa": omöjligt att reversera. Funktionen körs endast i en riktning.
Tre egenskaper som krävs för lagring av autentiseringsuppgifter:
1. Envägsfunktion (preimage resistance). Givet hash(password) finns ingen algoritm som kan återställa password snabbare än brute-force. bcrypt, scrypt och argon2 uppfyller alla denna egenskap.
2. Salt. Ett slumpmässigt värde som läggs till lösenordet före hashningen. Samma lösenord med olika salt ger olika hash. Syfte: motverkar rainbow tables (förberäknade hash-tabeller). Utan salt: en angripare beräknar hash('password123') en gång och kan kontrollera alla 1 miljon användare samtidigt. Med salt: varje användare får en unik hash även för samma lösenord.
3. Långsam av design. bcrypt tar emot en work factor. Högre work factor innebär fler iterationer och längre beräkningstid per hash-försök. Inloggning: 300 ms att hasha en gång. Acceptabelt. Brute-force: 300 ms per försök. Vid 1 miljard försök: 9,5 år per lösenord. Oacceptabelt för en angripare. Långsamheten är en funktion, inte en brist.
import bcrypt
# Lagring: envägs-hash med salt
def store_password(plaintext: str) -> bytes:
return bcrypt.hashpw(plaintext.encode(), bcrypt.gensalt(rounds=12))
# Verifiera: hasha kandidaten & jämför digests
def verify_password(plaintext: str, stored_hash: bytes) -> bool:
return bcrypt.checkpw(plaintext.encode(), stored_hash)
# ALDRIG lagrat: lösenordet i klartext
# ALDRIG återvunnen: klartexten från hashen
# Lösenordsåterställning, inte lösenordspåminnelse
Avvägningen
Envägshashning gör lösenordsåterställning omöjlig. En användare som glömmer sitt lösenord kan inte få det tillbaka. Ett lösenordspåminnelse-e-postmeddelande kan inte finnas. Användarupplevelsen förändras: ”glömt ditt lösenord? återställ det.” Inte en försämring: en säkerhetsgräns. Systemet som inte kan återställa ett lösenord kan inte läcka ett lösenord.
Ett databasintrång som exponerar bcrypt-hashes: alla hashar synliga, inga lösenord synliga. En angripare måste brute-force varje hash individuellt, med 300 ms per försök, och per-användare-salt som omöjliggör förberäknade tabeller. Ett intrång som exponerar klartextlösenord: total omedelbar exponering.
Stark kryptering räcker inte
En säkerhetsgranskning identifierar ett system för lagring av inloggningsuppgifter. Lösenord lagras med AES-256-CBC-kryptering med en server-sida nyckel. Granskningsrapporten markerar det som en Glass Safe-defekt.
Ingenjörsteamet svarar: 'AES-256 är den starkaste symmetriska chiffer som finns. Nyckeln finns i en hårdvarusäkerhetsmodul. Ingen angripare kan dekryptera dessa lösenord.'