English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

gast
1 / ?
terug naar lessen

Wat maakt een opslagformaat herstelbaar

Vier opslagformaten, gerangschikt op herstelbaarheid:

FormaatHerstelbaar?VoorbeeldHerstelmethode
PlaintextJapassword: hunter2Lees het bestand
Base64JacGFzc3dvcmQ=base64 --decode
Omkeerbare cipher (AES)JaENC[AES256:...]Ontsleutel met sleutel
Eenrichtingshash (bcrypt)Nee$2b$12$...Kan niet worden omgekeerd; brute-force vereist

Platte tekst, base64 en omkeerbare cipher: allemaal herstelbaar. Een enkele credential-database-dump geeft een aanvaller alle wachtwoorden in platte tekst, voor alle gebruikers, tegelijk. Eén inbreuk; totale blootstelling.

Het Mailman 2.x-voorbeeld

Mailman 2.x (GNU mailing list manager): bewaarde abonneewachtwoorden in platte tekst. Maandelijkse wachtwoordherinneringsmail: stuurde alle abonnees hun wachtwoord in platte tekst. Twee afzonderlijke defecten, beide MOAD-0006:

1. Opslag: platte tekst in de lijst-database. Een servercompromis legt alle abonneewachtwoorden bloot.

2. Broadcast: maandelijkse e-mail stuurt het wachtwoord in platte tekst via SMTP naar de e-mailserver van de abonnee. E-mail reist in platte tekst over meerdere SMTP-hops.

Het Mailman-team ontwierp beide gedragingen. Herstel was de functie: abonnees konden vergeten wachtwoorden ophalen. De naam Glass Safe komt hier vandaan: de kluis bevat inloggegevens in zichtbare vorm. Iedereen die bij de kluis komt, kan alle inhoud tegelijk lezen.

Het Al-Gestolen Principe

Een inloggegeven dat in herstelbare vorm is opgeslagen, is een inloggegeven dat al gestolen is. De aanvaller is er nog niet. De inbreuk heeft nog niet plaatsgevonden. Maar de architectuur garandeert: wanneer een inbreuk plaatsvindt, vallen alle inloggegevens tegelijk. Geen inbreuk gebeurt geïsoleerd; elk inloggegeven in herstelbare opslag wordt in dezelfde operatie aan de aanvaller overgedragen.

MOAD-0006 vs MOAD-0004

MOAD-0004 (Logged Secret): inloggegevens die per ongeluk naar logs zijn geschreven. Het schrijven naar de log was niet de bedoeling; het was een neveneffect van het inschakelen van header-logging voor debugging.

MOAD-0006 (Glass Safe): inloggegevens die opzettelijk in herstelbare vorm zijn opgeslagen. Herstel was de intentie. De wachtwoordherinneringsfunctie vereiste dat het wachtwoord werd opgeslagen. De functie om het wachtwoord weer te geven vereiste dat het werd opgeslagen. De architecturale keuze voor herstel creëerde het defect.

Eénregelig onderscheid: MOAD-0004 plaatst inloggegevens per ongeluk in logs; MOAD-0006 slaat inloggegevens opzettelijk in herstelbare vorm op. De oplossingen werken op verschillende lagen.

Structureel vs Accidenteel

Het architecturale onderscheid tussen MOAD-0006 en MOAD-0004 bepaalt de fix-strategie. Een accidentele logschrijving: herstel de serialisatielaag. Een voor herstel ontworpen opslag: herontwerp de functionaliteit die herstel vereiste.

Waarom is een Glass Safe structureel anders dan MOAD-0004? Beschrijf elk defect in één zin. Wat betekent dit voor de fix?

Waarom bcrypt werkt

Een eenrichtingshashfunctie accepteert een wachtwoord en produceert een digest van vaste lengte. Gegeven de digest kan het originele wachtwoord niet worden teruggevonden. Niet 'moeilijk terug te vinden': onmogelijk om te omkeren. De functie werkt slechts in één richting.

Drie eigenschappen vereist voor credential-opslag:

1. Eenrichtingsfunctie (preimage-resistentie). Gegeven hash(password) bestaat er geen algoritme dat password sneller kan herstellen dan brute-force. bcrypt, scrypt en argon2 voldoen allemaal aan deze eigenschap.

2. Salt. Een willekeurige waarde die vóór het hashen aan het wachtwoord wordt toegevoegd. Zelfde wachtwoord, andere salt → andere hash. Doel: rainbow tables (vooraf berekende hash-woordenboeken) onbruikbaar maken. Zonder salt: een aanvaller berekent hash('password123') één keer en controleert alle 1 miljoen gebruikers tegelijk. Met salt: elke gebruiker heeft een unieke hash, zelfs bij hetzelfde wachtwoord.

3. Opzettelijk traag. bcrypt accepteert een work factor. Hogere work factor = meer iteraties = meer rekentijd per hash-poging. Inloggen: 300 ms om één keer te hashen. Acceptabel. Brute-force: 300 ms per poging. Bij 1 miljard pogingen: 9,5 jaar per wachtwoord. Onacceptabel voor een aanvaller. De traagheid is een feature, geen defect.

import bcrypt

# Opslaan: eenrichtingshash met salt
def store_password(plaintext: str) -> bytes:
return bcrypt.hashpw(plaintext.encode(), bcrypt.gensalt(rounds=12))

# Verifieer: hash de kandidaat & vergelijk digests
def verify_password(plaintext: str, stored_hash: bytes) -> bool:
return bcrypt.checkpw(plaintext.encode(), stored_hash)

# NOOIT opgeslagen: het plaintext-wachtwoord
# NOOIT hersteld: de plaintext uit de hash
# Wachtwoord reset, geen wachtwoordherinnering

De afweging

Eenrichtingshashing maakt wachtwoordherstel onmogelijk. Een gebruiker die zijn wachtwoord vergeet, kan het niet terugkrijgen. Een wachtwoordherinnering per e-mail kan niet bestaan. De gebruikerservaring verandert: ‘wachtwoord vergeten? Reset het.’ Dit is geen verslechtering: het is een beveiligingsgrens. Het systeem dat een wachtwoord niet kan herstellen, kan het ook niet lekken.

Een databaselek dat bcrypt-hashes blootlegt: alle hashes zichtbaar, geen wachtwoorden zichtbaar. Een aanvaller moet elke hash afzonderlijk brute-forcen, met 300 ms per poging, en per-gebruiker-salt die vooraf berekende tabellen onbruikbaar maakt. Een lek dat plaintext-wachtwoorden blootlegt: volledige, directe blootstelling.

Sterke encryptie is niet genoeg

Een beveiligingsaudit onderzoekt een systeem voor het opslaan van inloggegevens. Wachtwoorden worden opgeslagen met AES-256-CBC-encryptie en een server-side sleutel. Het auditrapport markeert dit als een Glass Safe-defect.

Het engineering-team antwoordt: 'AES-256 is de sterkste symmetrische cipher die beschikbaar is. De sleutel bevindt zich in een hardware security module. Geen aanvaller kan deze wachtwoorden ontsleutelen.'

Waarom blijft dit MOAD-0006, zelfs met sterke encryptie? Wat is de juiste oplossing?