We staan vandaag op Product Hunt! Reactie plaatsen
Authenticator 1.16.0 is er. Bekijk wat er nieuw is
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.
De extensie is een Manifest V3-Chrome-extensie die TOTP-codes lokaal genereert met OTPAuth. Voor het genereren van codes en het opslaan en versleutelen van accounts is geen backend nodig, en er zijn geen gebruikersaccounts. We draaien één server, api.authenticator.sh, voor het gratis plan en Pro — hieronder beschreven — en die ontvangt nooit een geheim, een accountnaam, een uitgever of een code.
Die server bewaart voor niemands accounts sleutelmateriaal: er is 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.
Wachtwoordbeveiliging is optioneel en staat standaard uit. Met de beveiliging aan:
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:
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:
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.
Het manifest declareert vijf permissies en geen host-permissies:
Er zijn Er zijn geen content scripts, geen tabs-, cookies- of webRequest-permissies, en geen web-accessible resources. Niets van ons bestaat in een pagina totdat je daar om een code vraagt; wat dan draait wordt geïnjecteerd voor dat ene tabblad en die ene aanroep, onder de toestemming die je eigen klik geeft, en laat niets achter.
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.
Sinds 1.14.0 maakt de extensie één keer per dag contact met api.authenticator.sh — bij het starten van de browser of nadat de pop-up is weergegeven, zodat het tonen van een code er nooit op wacht. Het verzoek is een gesloten lijst velden, opgebouwd in één functie in src/billing/sync.ts en door een test aan die lijst gehouden:
Nooit verzonden: geheimen, accountnamen, uitgevers, codes, of de sites waarop ze worden gebruikt. De server leidt het land af uit het verzoek, aan de edge, en slaat het IP-adres niet op. De feedbackpagina bij het verwijderen krijgt dezelfde installatie-id mee als ?i=: de pagina meldt aan de server dat de installatie is verwijderd en koppelt er een optioneel antwoord op de enquête aan.
Hiervoor bewaard in chrome.storage.local: de installatie-id, het laatste ondertekende beleid en de laatste licentie, de licentiesleutel die deze installatie heeft (ingetypt, of ontvangen na een aankoop op deze installatie), het aantal keer geopend per dag tot de server dat heeft, en de gebeurtenissen in de wachtrij — geen accountgegevens. Zolang sync aanstaat, gaan er ook twee dingen naar Chrome Sync: of de installatie dateert van vóór het betaalde plan, en die licentiesleutel — zodat de andere Chrome-profielen van de gebruiker ze overnemen en Pro vanzelf aanzetten. Sync uitzetten haalt beide weer uit Chrome Sync; sync weer aanzetten zet ze terug.
Wat er terugkomt, en hoe de extensie daarmee omgaat:
De limiet is geen DRM: de code is open source, en een fork kan hem verwijderen. Wat nooit mogelijk mag zijn, is dat iemand de licentie van een ander bemachtigt of gebruikt, of de installatie van een ander beperkt maakt — dat is een kwetsbaarheid, en valt binnen de scope van ons beveiligingsbeleid.
Twee soorten verzoeken doet de extensie uit zichzelf: de klokcontrole en de dagelijkse check-in voor het gratis plan en Pro. Al het andere hieronder gebeurt doordat de gebruiker ergens op klikte. Manifest V3 verbiedt externe code, en niets hiervan draagt accounts, geheime sleutels of gegenereerde codes mee. De volledige lijst:
| Host | Wanneer | Bevat gebruikersgegevens? |
|---|---|---|
| time.akamai.com timeapi.io cloudflare.com | Controle op klokafwijking, gecachet; is geen enkele bron bereikbaar, dan meldt Instellingen dat. Bij een afwijkende klok werkt TOTP niet meer. | Nee |
| authenticator.sh | Welkomstpagina bij installatie; feedbackpagina bij verwijderen, met de installatie-id in het adres; hulp- en supportpagina's wanneer ze vanuit de pop-up worden geopend. | De installatie-id, alleen op de feedbackpagina bij verwijderen; verder nee (gewone webserverlogs) |
| api.authenticator.sh | De check-in, één keer per dag; aanroepen voor afrekenen, licentie en klantenportaal wanneer de gebruiker Pro koopt, een sleutel invoert, een aankoop herstelt of een abonnement beheert. | De velden die hierboven staan — nooit accountgegevens. Een licentiesleutel of een e-mailadres alleen als de gebruiker er een intypt |
| checkout.stripe.com billing.stripe.com | Stripe Checkout en het klantenportaal, in een tabblad geopend wanneer de gebruiker Pro koopt of een abonnement beheert. | Wat de koper daar invult. De eigen voorwaarden van Stripe en Link zijn van toepassing |
| chromewebstore.google.com | Storepagina, alleen bij een klik in een tabblad geopend: het beoordelingsformulier vanuit de beoordelingsvraag. | Nee (voor Google is het een bezoek aan een storepagina zoals elk ander) |
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.
U hoeft niets van het bovenstaande op ons woord aan te nemen. De extensie is open source en elke release is reproduceerbaar:
.crx uit de Chrome Web Store en pak hem uitnpm ci && npm run build op Node 20 LTSdist/ met het uitgepakte pakketBij 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 broncodeWe 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:
Wat we er wel tegenover zetten: volledige transparantie van de broncode, een verifieerbare build, een minimaal permissieoppervlak en een server die uw geheimen, accountnamen of codes überhaupt nooit te zien krijgt.
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.