Beveiliging
Beveiliging ís het product.
Een wachtwoordmanager bewaart de sleutels van je hele leven. Hier lees je in gewone taal hoe 2Secret ze beschermt, wat het (nog) niet kan, en hoe je ons werk kunt controleren.
Uitgangspunten
Zes beloften die het ontwerp voor je nakomt.
-
Alleen jij kunt ontsleutelen
Versleutelen en ontsleutelen gebeurt op je apparaat. Servers, hostingpartijen en wij kunnen je data niet lezen.
-
Twee geheimen, niet één
Je hoofdwachtwoord én een geheime sleutel van je apparaat. Eén van de twee stelen is niet genoeg.
-
Alles versleutelen
Niet alleen wachtwoorden: ook titels, URL’s, gebruikersnamen, notities en kluisnamen zijn versleuteld.
-
Je data blijft van jou
Het 2Secret-project bewaart geen kluizen. Houd de jouwe op je apparaat of op je eigen server.
-
Open voor controle
Alle code is opensource onder de MIT- of Apache 2.0-licentie. Iedereen kan dus nagaan wat die doet.
-
Eerlijk over grenzen
We vertellen je eerlijk wat niet beschermd is en wat nog niet af is.
Two-Secret Key Derivation
Twee geheimen, zodat een gestolen database niets waard is.
Wordt een kluis alleen door een hoofdwachtwoord beschermd, dan kan iemand die de data van de server steelt in alle rust miljarden pogingen doen, en zwakke of hergebruikte wachtwoorden gaan dan uiteindelijk om.
2Secret voegt een tweede geheim toe: de geheime sleutel, 130 willekeurige bits die op je apparaat worden gemaakt. Je sleutels worden afgeleid van het hoofdwachtwoord én de geheime sleutel samen. De geheime sleutel gaat nooit naar de server. Een kopie van de serverdatabase bevat dus niet wat een aanvaller nodig heeft, hoeveel pogingen die ook doet.
Voor wie het technisch wil weten
- Het hoofdwachtwoord wordt versterkt met Argon2id, met 64 MiB geheugen en 3 rondes.
- Het wordt gecombineerd met de geheime sleutel van 130 bits om je sleutels af te leiden.
- Hoofdwachtwoorden moeten minstens 12 tekens hebben en als ‘goed’ beoordeeld worden.
- Apps leiden geen sleutels af, en servers bewaren geen accounts, met Argon2id-instellingen onder 19 MiB en 2 rondes. Een kwaadwillende of verouderde server kan je app dus niet overhalen tot een zwakke sleutelafleiding.
- De server bewaart alleen een Argon2id-hash van een authenticatiesleutel, nooit iets waarmee je data te ontsleutelen is.
Geheime sleutel en noodkit
Bewaar je noodkit op een veilige plek.
Je geheime sleutel ziet eruit als 2S-XXXXXX-XXXXX-XXXXX-XXXXX-XXXXXX. Je hoeft hem niet te onthouden: je apparaten bewaren hem, en hij staat op je noodkit die je krijgt als je je account aanmaakt.
Je hebt de geheime sleutel samen met je hoofdwachtwoord nodig om op een nieuw apparaat in te loggen. Omdat niemand anders je kluis kan lezen, kan ook niemand anders je hoofdwachtwoord resetten of je geheime sleutel voor je terughalen.
- Print hem, of bewaar hem offline, bijvoorbeeld in een kluis of bij belangrijke papieren
- Bewaar hem niet op dezelfde plek als je hoofdwachtwoord
- Deel hem nooit: niemand van 2Secret zal er ooit om vragen
Versleuteling
Elk item op je apparaat op slot, elke kluis met een eigen sleutel.
Voordat er iets je apparaat verlaat, wordt elk item versleuteld met XChaCha20-Poly1305 en een sleutel van 256 bits. Elke kluis heeft een eigen sleutel. Deel je één kluis, dan blijft een andere dus dicht.
En het gaat niet alleen om wachtwoorden. Titels, URL’s, gebruikersnamen, notities en kluisnamen zijn ook versleuteld. LastPass liet websiteadressen juist leesbaar op zijn servers staan.
Voor wie het technisch wil weten
- Geauthenticeerde versleuteling: XChaCha20-Poly1305 merkt elke wijziging aan de versleutelde data.
- Vast aan zijn plek: elk versleuteld stuk data draagt ‘associated data’ die het aan zijn plek koppelt. Een server kan een versleuteld item dus niet naar een andere kluis verplaatsen, of het ene item voor het andere verwisselen, zonder dat ontsleutelen mislukt.
- Opvulling: data wordt opgevuld tot vaste maten, zodat de server de precieze grootte van je items niet leert.
Zero knowledge
Wat de server wel en niet kan zien.
Synchroniseer je, dan praten je apparaten met een 2Secret-server: een die je zelf draait, of een die iemand draait die je vertrouwt. Dit kan die server, en wie hem beheert, wel en niet zien.
| Gegevens | Zichtbaar voor de server? | Waarom |
|---|---|---|
| Je hoofdwachtwoord | Nee | Het verlaat je apparaat nooit. |
| Je geheime sleutel | Nee | Op je apparaat gemaakt en nooit verstuurd. |
| Wachtwoorden, notities, kaartnummers en andere inhoud | Nee | Versleuteld met XChaCha20-Poly1305 vóór het uploaden. |
| Titels, URL’s, gebruikersnamen en kluisnamen | Nee | Ook versleuteld. |
| De precieze grootte van je items | Nee | Opgevuld tot vaste maten. |
| Je e-mailadres en weergavenaam | Ja | Nodig om in te loggen en te delen. |
| Je salt, Argon2id-instellingen en publieke sleutels | Ja | Nodig om nieuwe apparaten in te stellen en kluizen te delen. Niets daarvan kan iets ontsleutelen. |
| Een hash van je authenticatiesleutel | Ja | Een Argon2id-hash: genoeg om een aanmelding te controleren, nutteloos om te ontsleutelen. |
| Versleutelde data | Ja | Dat is wat hij bewaart, zonder de sleutels om het te openen. |
| Wat je via een link deelt, en de kluissleutels voor je noodcontacten | Nee | De sleutel van een link zit alleen in de link; de sleutels voor noodtoegang zijn versleuteld voor de publieke sleutels van je contacten. |
| Wanneer deel-links verlopen, hoe vaak ze nog open kunnen en of ze een wachtwoord hebben; je noodcontacten, hun wachttijden en verzoeken | Ja | Nodig om links uit te geven en te verwijderen, en om de wachttijd te bewaken. |
| Metadata: hoeveel kluizen en items je hebt, hun grootteklasse, wanneer ze veranderden, wie met wie een kluis deelt en met welke rol, IP-adressen | Deels | Dit heeft hij nodig om te synchroniseren en te delen, en zoals elke server ziet hij verkeer. Zie de beperkingen hieronder. |
Draai je je eigen server, dan ben jij ‘de beheerder’, of degene die je vertrouwt om hem te hosten.
Server
Een server die zo weinig mogelijk weet.
-
Alleen versleutelde data
Versleutelde data, een Argon2id-hash van een authenticatiesleutel en wat hij nodig heeft om je te laten inloggen en delen. Nooit een sleutel die iets ontsleutelt.
-
Beperkt aantal inlogpogingen
Hooguit 10 mislukte inlogpogingen per account per 15 minuten.
-
Geen accounts opsporen
Onbekende e-mailadressen krijgen vaste nepsalts, en mislukte inlogpogingen duren even lang als echte. De server verraadt dus niet wie een account heeft.
-
Beveiligde webkluis
De webkluis wordt geleverd met een strikte Content-Security-Policy: geen inline scripts, geen
eval, niet in een frame te laden.
Kwantumbestendig delen
Delen dat privé blijft, ook in een kwantumtoekomst.
Sommige aanvallers slaan nu versleuteld verkeer op, in de hoop het te ontsleutelen zodra kwantumcomputers krachtig genoeg zijn: ‘nu oogsten, later ontsleutelen’.
Deel je een kluis, dan pakt 2Secret de sleutel van die kluis voor de ander in met een combinatie van X25519 en ML-KEM-768, de post-kwantumstandaard die NIST als FIPS 203 publiceerde. Signal (PQXDH) en Apple (PQ3) doen het op dezelfde manier: een aanvaller moet ze allebei kraken.
Voor wie het technisch wil weten
- De kluissleutel wordt ingepakt met hybride X25519 + ML-KEM-768.
- De server geeft de ingepakte sleutel alleen door.
- Bij de volgende synchronisatie van de ontvanger wordt de sleutel opnieuw ingepakt met diens eigen accountsleutel van 256 bits.
- Rollen: kijker (lezen), bewerker (items wijzigen) en beheerder (ook leden beheren).
- Iemand verwijderen geeft de kluis een nieuwe sleutel: alles wordt opnieuw versleuteld, dus wat daarna wordt toegevoegd of gewijzigd, is onleesbaar met de sleutel die diegene had. Beheerders kunnen de sleutel van een kluis ook zelf vervangen.
Vingerafdrukken
Weet zeker met wie je deelt.
Elk account heeft een publieke sleutel met een korte vingerafdruk, zoals 3F9A-77C1-0B2E-91D4. Deel je een kluis, dan toont 2Secret de vingerafdruk van de ander in de ledenlijst; de ander vindt de eigen vingerafdruk in Instellingen. Vergelijk ze in het echt of tijdens een gesprek. Komen ze overeen, dan heeft niemand ertussen, zelfs geen gehackte server, een eigen sleutel ertussen geschoven.
Noodtoegang
Toegang voor iemand die je vertrouwt, na een wachttijd die jij kiest.
Je apparaat versleutelt de sleutel van elke kluis die van jou is voor elk noodcontact, op dezelfde kwantumbestendige manier als bij delen, en houdt dat bij elke synchronisatie bij. De server houdt die sleutels achter en kan ze niet openen. Vraagt een contact om toegang en weiger je niet binnen de wachttijd, dan maakt de server diegene kijker van die kluizen.
Voor wie het technisch wil weten
- Tot tien contacten per account, elk met een wachttijd van 1 tot 90 dagen (1 tot 30 in de apps). Vergelijk hun vingerafdruk, net als bij het delen van een kluis.
- Weiger je nadat de toegang al gegeven is, beëindig je die of verwijder je het contact, dan verdwijnt diegene uit je kluizen en geeft je apparaat die kluizen nieuwe sleutels.
- Kluizen die anderen met jou delen, horen er nooit bij. Niemand krijgt je account, je hoofdwachtwoord of je geheime sleutel.
- De server bewaakt de wachttijd: een server die met je contact samenwerkt, kan eerder toegang geven. Je kluizen zelf lezen kan hij niet.
Browserextensie
Automatisch invullen, zonder de risico’s.
Bij automatisch invullen zijn wachtwoordmanagers al eens de mist in gegaan: webpagina’s en verborgen frames die het invullen in gang zetten of gegevens uitlezen. De extensie van 2Secret is rond die lessen ontworpen.
-
Vult alleen in na een klik
Nooit bij het laden van een pagina, nooit op de achtergrond.
-
Controleert vlak voor het invullen opnieuw
De pagina en elk frame worden op het moment van invullen opnieuw vergeleken met de website van het item.
-
Herkent het echte domein
Websites worden herkend op hun registreerbare domein met de Public Suffix List. Nagemaakte subdomeinen trappen er dus niet in.
-
Geen terugval naar http
Een login die bij een
https-site hoort, wordt nooit in eenhttp-pagina ingevuld. -
Logins blijven buiten de pagina
Logins en eenmalige codes gaan nooit door een contentscript. Het kleine passkey-script leest niets van de pagina; het geeft alleen het passkey-verzoek door.
-
Jij beslist over passkeys
Een website kan alleen om een passkey vragen. 2Secret opent een eigen venster waarin jij er een bewaart of gebruikt, of de browser een ander apparaat laat gebruiken.
Lessen van LastPass
Wat er elders misging, en hoe 2Secret ermee omgaat.
Aanvallers stalen versleutelde back-ups van LastPass-kluizen. De zwakke plekken die die lekken zo schadelijk maakten, hebben het ontwerp van 2Secret gevormd.
| Wat er bij LastPass misging | Hoe 2Secret ermee omgaat |
|---|---|
| Gestolen back-ups van kluizen konden offline worden aangevallen; zwakke hoofdwachtwoorden vielen als eerste. | De geheime sleutel voegt 130 willekeurige bits toe aan elk account: de serverdatabase alleen is waardeloos om wachtwoorden te raden. |
| Websiteadressen (URL’s) werden onversleuteld bewaard, waardoor zichtbaar was welke sites iedereen gebruikte. | Titels, URL’s, gebruikersnamen, notities en kluisnamen zijn allemaal versleuteld; de grootte van items wordt verhuld. |
| Oude accounts hielden jarenlang 1 tot 5.000 PBKDF2-rondes. | Argon2id (64 MiB, 3 rondes) vanaf dag één, met een afgedwongen minimum in de app en op de server. |
| Korte hoofdwachtwoorden (8 tekens) waren toegestaan. | Minstens 12 tekens en een beoordeling ‘goed’. |
| Oudere kluizen gebruikten AES-ECB/CBC zonder bescherming van de integriteit. | Geauthenticeerde versleuteling (XChaCha20-Poly1305), met elk versleuteld stuk data vast aan zijn plek. |
| Fouten in de browserextensie lieten webpagina’s en iframes het invullen in gang zetten of gegevens uitlezen. | Alleen invullen na een klik, met de pagina en elk frame opnieuw gecontroleerd tegen het item. Pagina’s kunnen alleen om een passkey vragen, en dan opent 2Secret zodat jij beslist. |
| Toegang tot de opslag van de kluizen via een gehackte engineer legde alles bloot. | De server heeft nooit een sleutel die iets ontsleutelt, en wie zelf host, houdt de eigen infrastructuur in handen. |
Dezelfde vergelijking staat in de white paper over beveiliging, naast de rest van het ontwerp.
Eerlijke beperkingen
Waar 2Secret niet tegen beschermt, of wat het nog niet doet.
Geen beveiliging is perfect, en we vertellen je de grenzen liever zelf.
- Nog geen onafhankelijke audit. De cryptografie gebruikt goed onderzochte algoritmes en de code is open voor controle, maar een onafhankelijk bureau heeft 2Secret nog niet doorgelicht.
- De beheerder van de server ziet metadata. Die kan je kluis niet lezen, maar ziet wel je e-mailadres, wanneer je synchroniseert, hoeveel items je hebt en hun grootteklasse, welke accounts een kluis delen en welke IP-adressen verbinding maken.
- De webkluis is zo betrouwbaar als de server die hem levert. Een kwaadaardige of gehackte server kan een aangepaste webapp sturen. De apps voor computer en telefoon, de extensie en de CLI hebben dat probleem niet.
- Een gedeelde link kan worden gekopieerd. Wie een deel-link opent, kan bewaren wat diegene zag. Een server die gehackt is terwijl een link geldig is, kan een pagina sturen die de sleutel van de link lekt; links die snel verlopen en één keer open kunnen, beperken dat.
- De server bewaakt de wachttijd van noodtoegang. Een server die met je noodcontact samenwerkt, kan diegene eerder toegang geven. Je kluizen zelf lezen kan hij nog steeds niet.
- Een geïnfecteerd apparaat ziet wat jij ziet. 2Secret beschermt niet tegen malware die als jou draait op een ontgrendeld apparaat, of tegen een gehackt besturingssysteem of een gehackte browser: die kunnen het scherm, het geheugen en je toetsaanslagen uitlezen.
- Geheim kwijt, kluis kwijt. Verlies je je hoofdwachtwoord of je geheime sleutel, dan kan niemand je data terughalen, ook de beheerder van de server niet. Dat is de prijs van het feit dat niemand anders hem kan lezen.
- De TLS-verbinding bij het inloggen is misschien niet kwantumbestendig. Dat hangt af van je besturingssysteem of browser en de proxy vóór de server. De data daarbinnen is hoe dan ook end-to-end versleuteld.
- Nog niet aanwezig: biometrisch ontgrendelen op Linux, Android en in de browser (daar is het hoofdwachtwoord nodig); passkeys aanmaken buiten de browserextensie, en ze gebruiken op Android en in de desktopapps; een Safari-extensie; automatisch invullen op Android.
De volledige, actuele lijst met beveiligingsbeperkingen staat in de white paper.
Controleer ons werk
Iets gevonden? Vertel het ons eerst.
We verwelkomen beveiligingsonderzoek. Meld kwetsbaarheden vertrouwelijk, zodat we ze kunnen oplossen voordat iemand risico loopt.