Vi finns på Product Hunt i dag! Skriv en kommentar
Authenticator 1.16.0 är här. Se vad som är nytt
En teknisk översikt för säkerhetsgranskare. Allt här går att stämma av mot källkoden — även de delar som klär oss sämre, och som vi skriver ut i stället för att utelämna.
Tillägget är ett Chrome-tillägg med Manifest V3 som genererar TOTP-koder lokalt med OTPAuth. Att generera koder, lagra konton och kryptera dem sker helt utan backend, och det finns inga användarkonton. Vi driver en enda server, api.authenticator.sh, för gratisplanen och Pro — den beskrivs nedan — och den tar aldrig emot en hemlighet, ett kontonamn, en utfärdare eller en kod.
Den servern har inget nyckelmaterial för någons konton: det finns ingen nyckeldeponering och ingen återställningsväg som vi kontrollerar. Om en användare glömmer lösenordet och tappar bort återställningskoden kan vi inte hjälpa till — så är det tänkt.
Lösenordsskydd är valfritt och av som standard. När det är på:
Data krypteras aldrig direkt med en nyckel härledd ur lösenordet. En slumpmässig huvudnyckel krypterar posterna; PBKDF2-utdata omsluter bara den huvudnyckeln. Två följder av det, och båda spelar roll:
Med lösenordsskydd på krypteras hela kontoposten utom dess identifierare och fingeravtryck — inklusive tjänstens namn, så en stulen profil avslöjar inte vilka tjänster användaren har konton hos. När skyddet slås på krypteras posterna, verifieras genom att dekrypteras och jämföras, och först därefter tas varje kopia i klartext bort: webbläsarens lokala lagring, synk och alla sju roterande säkerhetskopior.
Rakt på sak, eftersom det påverkar er bedömning:
Kort sagt: det här skyddar data i vila. Det försvarar inte, och kan inte försvara, en enhet som redan står under en angripares kontroll medan den används.
Manifestet deklarerar fem behörigheter och inga host-behörigheter:
Det finns Det finns inga content scripts, inga tabs-, cookies- eller webRequest-behörigheter och inga web-accessible resources. Ingenting av vårt finns i en sida förrän du ber om en kod där; det som körs då injiceras för just den fliken och just det anropet, under det medgivande ditt eget klick ger, och lämnar inget kvar.
QR-skanning med kameran körs på en tilläggssida i en flik, inte i popupen — en popup förstörs när den tappar fokus, vilket är precis vad en behörighetsfråga gör. Det här kräver ingen behörighet i manifestet: det använder webbläsarens vanliga kamerafråga, som ges per tilläggs-origin och kan återkallas i webbplatsinställningarna, och den kommer aldrig förrän användaren öppnar skannern. Video avkodas lokalt och skickas eller sparas aldrig.
Sedan 1.14.0 kontaktar tillägget api.authenticator.sh en gång om dagen — när webbläsaren startar eller efter att popupen har ritats upp, aldrig på vägen till att visa en kod. Förfrågan består av en sluten lista med fält och byggs i en enda funktion i src/billing/sync.ts; ett test ser till att den håller sig till den listan:
Skickas aldrig: hemligheter, kontonamn, utfärdare, koder eller webbplatserna där de används. Servern tar landet ur förfrågan redan vid nätverkskanten (edge) och sparar inte IP-adressen. Avinstallationssidan får samma installations-id som ?i=: den meddelar servern att installationen har tagits bort och kopplar ett frivilligt enkätsvar till den.
Det som sparas i chrome.storage.local för detta: installations-id:t, den senaste signerade policyn och licensen, licensnyckeln som den här installationen har (inskriven, eller mottagen efter ett köp på den), antalet öppningar per dag tills servern har fått dem, samt de köade händelserna — inga kontodata. Medan synk är på sparas dessutom två saker i Chrome Sync — om installationen är äldre än betalplanen, och den licensnyckeln — så att användarens andra Chrome-profiler får med sig dem och slår på Pro av sig själva. Stängs synk av tas båda bort ur Chrome Sync, och slås den på igen läggs de tillbaka.
Vad som kommer tillbaka, och hur tillägget hanterar det:
Gränsen är inte DRM: koden är öppen källkod, och en fork kan ta bort den. Det som aldrig får vara möjligt är att någon skaffar eller använder en annan persons licens, eller gör någon annans installation begränsad — det är en sårbarhet och omfattas av vår säkerhetspolicy.
Två slags förfrågningar gör tillägget på eget initiativ: klockkontrollen och det dagliga anropet för gratisplanen och Pro. Allt annat nedan sker för att användaren klickat på något. Manifest V3 förbjuder fjärrkod, och inget av det här bär med sig konton, hemliga nycklar eller genererade koder. Hela listan:
| Värd | När | Innehåller användardata? |
|---|---|---|
| time.akamai.com timeapi.io cloudflare.com | Kontroll av klockavvikelse, cachad; går ingen källa att nå säger Inställningar det. TOTP slutar fungera vid felgående klocka. | Nej |
| authenticator.sh | Välkomstsida vid installation; feedbacksida vid avinstallation, med installations-id:t i adressen; hjälp- och supportsidor när de öppnas från popup-fönstret. | Installations-id:t, bara på avinstallationssidan; annars nej (vanliga webbserverloggar) |
| api.authenticator.sh | Det dagliga anropet för gratisplanen och Pro; anrop för kassa, licens och kundportal när användaren köper Pro, anger en nyckel, återställer ett köp eller hanterar en prenumeration. | Fälten som listas ovan — aldrig kontodata. En licensnyckel eller en e-postadress bara när användaren själv skriver in en |
| checkout.stripe.com billing.stripe.com | Stripe Checkout och kundportalen, öppnas i en flik när användaren köper Pro eller hanterar en prenumeration. | Det köparen fyller i där. Stripes och Links egna villkor gäller |
| chromewebstore.google.com | Butikssidan, öppnas i en flik först vid klick: recensionsformuläret från betygsfrågan. | Nej (för Google är det ett besök på en butikssida som vilket annat som helst) |
Inga typsnitt, skript, stilmallar eller bilder laddas från tredjepartsvärdar. Allt som behövs för att rita upp gränssnittet ligger i paketet.
Ingenting av ovanstående behöver tas på förtroende. Tillägget är öppen källkod och varje release går att återskapa:
.crx från Chrome Web Store och packa upp dennpm ci && npm run build på Node 20 LTSdist/ med det uppackade paketetMed varje GitHub-release publiceras en SHA-256 för varje fil i den byggda dist/, som SHA256SUMS-v<version>.txt och i sha256sum-format, så steg 4 blir en enda körning av sha256sum -c. Skillnader bör begränsas till filordning inuti arkiv och blanktecken i minifierad utdata mellan Node-patchversioner.
Körtidsberoendena är medvetet få — OTPAuth, React, jsQR, Zustand, Framer Motion och Lucide — låsta av en incheckad lockfil. En CycloneDX-SBOM finns på begäran.
Läs källkodenVi är en liten oberoende leverantör. Om något av följande är ett absolut krav i er process är det bättre att ni vet det nu än tre veckor in i en utvärdering:
Det vi erbjuder i stället är full insyn i källkoden, ett verifierbart bygge, en minimal behörighetsyta och en server som era hemligheter, kontonamn och koder aldrig ens skickas till.
Sårbarhetsrapporter och säkerhetsfrågor: security@authenticator.sh. Vår policy för ansvarsfullt röjande, omfattning, svarstider och safe harbour-villkor finns på sidan säkerhetspolicy; vad som lagras och vad som lämnar enheten står i integritetspolicyn.
Vi svarar gärna på ett skriftligt leverantörsformulär eller går igenom koden tillsammans med ett säkerhetsteam.
För allt som inte rör säkerhet — installation, kontoåterställning, faktureringsfrågor vid en utrullning — se support. Skicka inte sårbarhetsrapporter dit; den brevlådan hanteras inte som konfidentiell.