Toevoegen aan Chrome

Hoe het werkt

Een technisch overzicht voor security-reviewers. Alles hier is te controleren aan de broncode — ook de minder flatteuze punten, die we benoemen in plaats van weglaten.

Architectuur

Er is geen backend. De extensie is een Manifest V3-Chrome-extensie die TOTP-/HOTP-codes lokaal genereert met OTPAuth. We draaien geen servers, houden geen accounts bij en hebben geen kanaal waarlangs gebruikersgegevens ons zouden kunnen bereiken.

Omdat er geen server is, is er ook geen sleutelmateriaal aan serverzijde, geen key escrow en geen herstelpad dat wij beheren. Vergeet een gebruiker het wachtwoord en raakt de herstelcode kwijt, dan kunnen we niets doen — dat is opzet.

Cryptografie

Wachtwoordbeveiliging is optioneel en staat standaard uit. Met de beveiliging aan:

Versleuteling
AES-256-GCM, willekeurige 96-bits IV per record en per herschrijving
Sleutelafleiding
PBKDF2-HMAC-SHA256, 600.000 iteraties, willekeurige 128-bits salt (OWASP-richtlijn)
Hoofdsleutel
256 bits, uit crypto.getRandomValues, eenmalig gegenereerd; het wachtwoord verpakt hem alleen
Vingerafdrukken
HMAC-SHA256 onder een via HKDF afgeleide subsleutel, om records tussen apparaten samen te voegen
Opslag van de ontgrendelde sleutel
chrome.storage.session — alleen in geheugen, nooit naar schijf geschreven, gewist zodra de browser sluit, onbereikbaar voor content scripts
Automatisch vergrendelen
Bij elke opening / na 5, 15 of 60 minuten inactiviteit / tot de browser sluit
Implementatie
Uitsluitend WebCrypto. Geen enkele primitieve is zelfgebouwd en er wordt geen crypto-bibliotheek meegeleverd.

Waarom twee sleutelniveaus

Gegevens worden nooit rechtstreeks versleuteld met een van het wachtwoord afgeleide sleutel. Een willekeurige hoofdsleutel versleutelt de records; de PBKDF2-uitvoer verpakt alleen die hoofdsleutel. Daar volgen twee dingen uit, en beide doen ertoe:

  • Het wachtwoord wijzigen herschrijft 32 bytes in plaats van elk record, elke back-up en elke export opnieuw te versleutelen. Juist bij zulke massale herschrijvingen verliezen opslagsystemen data.
  • Een 160-bits herstelcode kan dezelfde hoofdsleutel onafhankelijk verpakken, dus een vergeten wachtwoord is te herstellen. De code wordt één keer getoond, moet ter bevestiging worden ingetypt en wordt na elk gebruik vervangen. Er wordt niets naar schijf geschreven voordat de gebruiker hem heeft bevestigd.

Wat wel en wat niet versleuteld is

Met wachtwoordbeveiliging aan wordt het hele accountrecord versleuteld, op de identificator en de vingerafdruk na — inclusief de servicenaam, zodat een gestolen profiel niet verraadt bij welke diensten iemand accounts heeft. Bij het inschakelen versleutelt de extensie de records, controleert ze door te ontsleutelen en te vergelijken en verwijdert pas daarna elke kopie in leesbare vorm: lokale browseropslag, sync en alle zeven roulerende back-upmomentopnamen.

Ronduit gezegd, omdat het meeweegt in uw beoordeling:

  • Met wachtwoordbeveiliging uit worden accounts onversleuteld opgeslagen en, als Chrome Sync aanstaat, gerepliceerd via het eigen Google-account van de gebruiker. Ze bereiken ons nooit, maar Google heeft ze wel. Sync kan worden uitgezet, wat ook verwijdert wat er al staat.
  • De gebruiksgeschiedenis per site — welk account op welk domein wordt gebruikt — staat lokaal opgeslagen en valt tijdens het verzamelen niet onder de kluis. Wachtwoordbeveiliging inschakelen wist die geschiedenis; ze kan ook los worden uitgezet.

Dreigingsmodel

Beschermt tegen

  • Een gestolen of gekopieerde browserprofielmap
  • Infostealer-malware die browsergegevens en masse wegsluist
  • Iemand met fysieke toegang tot een onbeheerde machine
  • Accountrecords die via Chrome Sync bij Google terechtkomen
  • Een verloren of gestolen back-upbestand (met wachtwoord beveiligde export)

Beschermt niet tegen

  • Malware die als de gebruiker draait terwijl de kluis ontgrendeld is
  • Een keylogger die het wachtwoord tijdens het typen opvangt
  • Een gecompromitteerde browser of een gecompromitteerd besturingssysteem
  • Compromittering van de externe diensten waarvoor de codes bedoeld zijn

Kortom: dit beschermt gegevens in rust. Het verdedigt geen apparaat dat tijdens gebruik al in handen van een aanvaller is — dat kan het ook niet.

Permissies

Het manifest declareert precies twee permissies en geen enkele host-permissie:

storage
Accounts en instellingen in lokale opslag, de ontgrendelde sleutel in sessieopslag en de optionele synckopie
activeTab
Leest de hostnaam van het actieve tabblad om het bijbehorende account te markeren, en legt het tabblad vast wanneer de gebruiker een QR-code van het scherm scant

Er zijn geen content scripts, geen tabs-, cookies- of webRequest-permissies en geen web-accessible resources. De extensie kan de inhoud van geen enkele pagina lezen of wijzigen.

Camera

QR-scannen met de camera draait op een extensiepagina in een tabblad, niet in de popup — een popup wordt vernietigd zodra hij focus verliest, en dat is precies wat een permissieverzoek doet. Hiervoor is geen permissie in het manifest nodig: het gebruikt het standaard cameraverzoek van de browser, verleend per extensie-origin en intrekbaar in de site-instellingen, en het verschijnt pas als de gebruiker de scanner opent. Video wordt lokaal gedecodeerd en nooit verzonden of opgeslagen.

Uitgaand netwerkverkeer

Bij normaal gebruik doet de extensie geen automatische verzoeken, en Manifest V3 verbiedt externe code. Alle verbindingen die ze kan maken:

HostWanneerBevat gebruikersgegevens?
worldtimeapi.org
timeapi.io
Controle op klokafwijking, gecachet, faalt stilzwijgend. Bij een afwijkende klok werkt TOTP niet meer.Nee
authenticator.shWelkomstpagina bij installatie; feedbackpagina bij verwijderen of beoordelen.Nee (gewone webserverlogs)

Er worden geen lettertypen, scripts, stylesheets of afbeeldingen van hosts van derden geladen. Alles wat nodig is om de interface te tonen zit in het pakket.

Controleren wat we publiceren

U hoeft niets van het bovenstaande op ons woord aan te nemen. De extensie is open source en elke release is reproduceerbaar:

  1. Download de gepubliceerde .crx uit de Chrome Web Store en pak hem uit
  2. Check de bijbehorende git-tag uit
  3. Draai npm ci && npm run build op Node 20 LTS
  4. Vergelijk de resulterende dist/ met het uitgepakte pakket

Bij elke GitHub-release publiceren we een SHA-256 van elk bestand in de geproduceerde dist/, als SHA256SUMS-v<version>.txt en in sha256sum-formaat, zodat stap 4 neerkomt op één keer sha256sum -c draaien. Verschillen zouden beperkt moeten blijven tot de bestandsvolgorde binnen archieven en witruimte in geminificeerde uitvoer tussen Node-patchversies.

De runtime-afhankelijkheden zijn bewust beperkt — OTPAuth, React, jsQR, Zustand, Framer Motion en Lucide — vastgezet door een ingecheckt lockfile. Een CycloneDX-SBOM is op verzoek beschikbaar.

Bekijk de broncode

Wat we niet hebben

We zijn een kleine onafhankelijke leverancier. Is een van de volgende punten een harde eis in uw proces, dan kunt u dat beter nu weten dan drie weken later in de beoordeling:

  • Geen SOC 2-, ISO 27001- of vergelijkbare certificering
  • Tot op heden geen externe pentest laten uitvoeren
  • Geen betaald bug-bountyprogramma

Wat we er wel tegenover zetten: volledige transparantie van de broncode, een verifieerbare build, een minimaal permissieoppervlak en geen serverinfrastructuur die uw gegevens überhaupt zou kunnen bewaren.

Contact

Kwetsbaarheidsmeldingen en security-vragen: security@authenticator.sh. Ons openbaarmakingsbeleid, de scope, reactietijden en safe-harbourvoorwaarden staan op de pagina beveiligingsbeleid; wat er wordt opgeslagen en wat het apparaat verlaat, staat in het privacybeleid.

We vullen graag een schriftelijke leveranciersvragenlijst in of lopen de code door met een securityteam.

Voor alles wat geen security-kwestie is — installatie, accountherstel, factuurvragen bij een uitrol — zie support. Stuur daar alstublieft geen kwetsbaarheidsmeldingen naartoe; die mailbox wordt niet als vertrouwelijk behandeld.