Una panoramica tecnica per chi valuta la sicurezza. Tutto quello che c'è qui è verificabile sul codice sorgente — comprese le parti che ci fanno meno bella figura, che dichiariamo invece di ometterle.
Non esiste un backend. L'estensione è un'estensione Chrome Manifest V3 che genera i codici TOTP/HOTP localmente con OTPAuth. Non gestiamo server, non teniamo account e non abbiamo alcun canale attraverso cui i dati dell'utente possano arrivare a noi.
Poiché non c'è un server, non c'è nemmeno materiale crittografico lato server, né deposito di chiavi, né alcun percorso di recupero controllato da noi. Se un utente dimentica la password e perde il codice di recupero, non possiamo aiutarlo: è una scelta progettuale.
La protezione con password è facoltativa e disattivata per impostazione predefinita. Quando è attiva:
I dati non vengono mai cifrati direttamente con una chiave derivata dalla password. Una chiave principale casuale cifra i record; l'output di PBKDF2 si limita a incapsulare quella chiave principale. Ne discendono due conseguenze, entrambe rilevanti:
Con la protezione con password attiva viene cifrato l'intero record dell'account tranne identificatore e impronta — nome del servizio compreso, così un profilo rubato non rivela presso quali servizi l'utente ha un account. All'attivazione l'estensione cifra i record, li verifica decifrandoli e confrontandoli e solo allora rimuove ogni copia in chiaro: archiviazione locale del browser, sincronizzazione e tutte e sette le istantanee di backup a rotazione.
Lo diciamo chiaramente, perché conta per la vostra valutazione:
In breve: questo protegge i dati a riposo. Non difende, e non può difendere, un dispositivo già sotto il controllo di un attaccante mentre viene usato.
Il manifest dichiara cinque permessi e nessun permesso host:
Non ci sono Non ci sono content script, né permessi tabs, cookies o webRequest, né web-accessible resources. Niente di nostro esiste in una pagina finché non ci chiedi un codice; ciò che viene eseguito allora è iniettato per quella scheda e quella invocazione, sotto l'autorizzazione che concede il tuo stesso clic, e non lascia nulla dietro di sé.
La scansione dei QR con la fotocamera gira su una pagina dell'estensione aperta in una scheda, non nel popup: un popup viene distrutto quando perde il focus, ed è esattamente ciò che fa una richiesta di permesso. Per questo non serve alcun permesso nel manifest: si usa la normale richiesta di accesso alla fotocamera del browser, concessa per origine dell'estensione e revocabile nelle impostazioni del sito, e non compare mai finché l'utente non apre lo scanner. Il video è decodificato localmente e non viene mai trasmesso né memorizzato.
Il controllo dell'orologio è l'unica richiesta che l'estensione fa di propria iniziativa; tutto il resto qui sotto avviene perché l'utente ha fatto clic. Manifest V3 vieta il codice remoto, e nulla di quanto segue trasporta account, chiavi segrete o codici generati. L'elenco completo:
| Host | Quando | Trasporta dati dell'utente? |
|---|---|---|
| time.akamai.com timeapi.io cloudflare.com | Controllo dello scarto dell'orologio, con cache; se nessuna fonte è raggiungibile, le Impostazioni lo dicono. Con l'orologio sfasato il TOTP smette di funzionare. | No |
| authenticator.sh | Pagina di benvenuto all'installazione; pagina di feedback alla disinstallazione; pagine di aiuto e assistenza quando vengono aperte dal popup. | No (normali log del server web) |
| chromewebstore.google.com | Pagina dello store, aperta in una nuova scheda solo al clic: il modulo di recensione dalla richiesta di valutazione, il nostro gestore di password dal banner di promozione incrociata. | No (per Google è la visita a una pagina dello store come un'altra) |
| authenticator.featurebase.app | Bacheca pubblica delle richieste, aperta in una nuova scheda dal link per proporre una funzione nella barra di assistenza. | Solo ciò che l'utente vi pubblica. Servizio di terze parti, con condizioni proprie. |
Nessun font, script, foglio di stile o immagine viene caricato da host di terze parti. Tutto ciò che serve a disegnare l'interfaccia è dentro il pacchetto.
Non dovete credere sulla parola a nulla di quanto sopra. L'estensione è open source e ogni rilascio è riproducibile:
.crx pubblicato dal Chrome Web Store e decomprimetelonpm ci && npm run build su Node 20 LTSdist/ ottenuto con il pacchetto decompressoCon ogni release su GitHub pubblichiamo uno SHA-256 per ciascun file del dist/ prodotto, come SHA256SUMS-v<version>.txt e in formato sha256sum: il passo 4 si riduce quindi a una sola esecuzione di sha256sum -c. Le differenze dovrebbero limitarsi all'ordine dei file dentro gli archivi e agli spazi nell'output minificato tra versioni patch di Node.
Le dipendenze a runtime sono volutamente poche — OTPAuth, React, jsQR, Zustand, Framer Motion e Lucide — fissate da un lockfile versionato. Un SBOM CycloneDX è disponibile su richiesta.
Leggere il codice sorgenteSiamo un piccolo fornitore indipendente. Se uno dei punti seguenti è un requisito vincolante per il vostro processo, è meglio saperlo ora che dopo tre settimane di valutazione:
Quello che offriamo in cambio è piena trasparenza del codice, una build verificabile, una superficie di permessi minima e nessuna infrastruttura server che possa in primo luogo custodire i vostri dati.
Segnalazioni di vulnerabilità e domande sulla sicurezza: security@authenticator.sh. La nostra policy di divulgazione, l'ambito, i tempi di risposta e le condizioni di safe harbour sono nella pagina policy di sicurezza; cosa viene memorizzato e cosa lascia il dispositivo è descritto nell'informativa sulla privacy.
Rispondiamo volentieri a un questionario scritto di valutazione fornitori o ripercorriamo il codice insieme a un team di sicurezza.
Per tutto ciò che non riguarda la sicurezza — installazione, recupero dell'account, domande di fatturazione legate a un rollout — vedete il supporto. Vi preghiamo di non inviare lì segnalazioni di vulnerabilità: quella casella non è trattata come riservata.