Beveiligingsmodel

Deze pagina beschrijft wat Rempar beschermt, hoe, en wat het niet beschermt. Het referentiedocument is het protocol v1, waarvan de tekenreeksen zijn vastgezet.

Doel

Een volledige compromittering van de server, zijn back-ups en zijn beheerder mag geen enkel geheim onthullen: geen hoofdwachtwoord, geen inhoud, zelfs niet de naam van een item.

Sleutelafleiding (alleen op het apparaat)

password     = NFKC(saisie)
master_key   = Argon2id(password, kdf_salt, m=65536 KiB, t=3, p=4, 32 octets)
auth_key     = HKDF-SHA256(master_key, info="rempart/auth/v1")
wrap_key     = HKDF-SHA256(master_key, info="rempart/wrap/v1")
  • kdf_salt: 16 willekeurige bytes, aangemaakt met het account of de lokale kluis.
  • auth_key wordt als accountwachtwoord naar de server gestuurd. Er kan niets anders uit worden afgeleid.
  • wrap_key verlaat het apparaat nooit. Zij verzegelt de kluissleutel.
  • Clients weigeren Argon2id-parameters die zwakker zijn dan m=19456, t=2, p=1, zelfs als de server ze voorstelt.

Verzegelingsformaat

seal(key, plaintext, aad) = base64( 0x01 || nonce(24) || XChaCha20-Poly1305(key, nonce, plaintext, aad) )

Elk gebruik heeft zijn vastgezette AAD-tekenreeks: rempart/vaultkey/v1, rempart/itemkey/v1|<item_id>, rempart/item/v1|<item_id>, rempart/export/v1, enz. Een blob kan niet in een andere context worden herhaald of aan een ander item worden gekoppeld.

Kluis en items

  • vault_key: 32 willekeurige bytes, één keer per kluis aangemaakt.
  • Elk item heeft zijn eigen item_key van 32 bytes. De opgeslagen blob is { k: seal(vault_key, item_key), c: seal(item_key, contenu) }.
  • De lijst wordt getoond vanuit een lokale verzegelde index. Een fiche openen ontsleutelt alleen die fiche.
  • De identificaties van items zijn UUID v4, gebonden in beide AAD's.

Noodkit

32 willekeurige bytes, slechts één keer getoond in Crockford base32. recovery_wrap = HKDF(recovery_key, "rempart/recovery-wrap/v1") verzegelt een kopie van de kluissleutel; recovery_auth = HKDF(recovery_key, "rempart/recovery-auth/v1") authenticeert een herstel bij de server.

Account en tokens

  • Pre-login tegen enumeratie: een deterministisch vals salt wordt teruggegeven voor onbekende e-mailadressen.
  • Toegangstoken per apparaat (60 min) en roterend vernieuwingstoken (30 dagen). Een tweede gebruik van een vernieuwd token trekt het apparaat in (token_reused).
  • Optionele TOTP-2FA, aanbevolen. Verplicht voor beheerders.
  • Alle gevoelige routes zijn beperkt in snelheid.

Aan de kant van het apparaat

  • Geheimen gemaskeerd met 12 vaste punten, na 30 s opnieuw gemaskeerd.
  • Klembord gewist na 30 s (instelbaar van 10 s tot 2 min). Herstelzinnen worden nooit in hun geheel gekopieerd.
  • Vergrendeling na 5 min, in sluimerstand en bij het sluiten; de kluissleutel wordt in het geheugen op nul gezet.
  • Oplopende wachttijden na mislukking: 30 s, 1 min, 5 min. Nooit een stille wissing.
  • Android: FLAG_SECURE verbiedt schermopnamen. iOS en macOS: privacysluier in de app-kiezer.
  • Biometrie: de kluissleutel wordt toevertrouwd aan de systeemsleutelhanger beschermd door Touch ID, Face ID of de vingerafdruk, nooit aan een bestand.

Wat het model niet dekt

  • Een gecompromitteerd apparaat terwijl de kluis open is (spionagesoftware, keylogger).
  • Een zwak hoofdwachtwoord: Argon2id vertraagt de aanval, maar maakt die niet onmogelijk.
  • Het gelijktijdige verlies van het hoofdwachtwoord en de noodkit.
  • De accountmetagegevens: e-mailadres, aantal items, grootte van de blobs, data en platformen van de apparaten.

Een kwetsbaarheid melden

Schrijf naar security@rempar.org. Wij bevestigen de ontvangst binnen 48 uur en publiceren een correctie vóór elke openbaarmaking.


Een vraag die hier niet wordt beantwoord? support@rempar.org