it-swarm.dev

Come funziona Google Authenticator?

Google Authenticator è un'alternativa a SMS per la verifica 2Step, l'installazione di un'app su Android a cui verranno inviati i codici.

Funziona senza alcuna connettività; funziona anche in modalità aereo. Questo è quello che non capisco. Come è possibile che funzioni senza connettività? In che modo il telefono cellulare e il server si sincronizzano per sapere quale codice è valido in quel preciso momento?

227
eez0

Google Authenticator supporta entrambi gli algoritmi HOTP e TOTP per la generazione di password singole.

Con HOTP, il server e il client condividono un valore segreto e un contatore, che vengono utilizzati per calcolare una password singola in modo indipendente su entrambi i lati. Ogni volta che viene generata e utilizzata una password, il contatore viene incrementato su entrambi i lati, consentendo al server e al client di rimanere sincronizzati.

TOTP utilizza essenzialmente lo stesso algoritmo di HOTP con una grande differenza. Il contatore utilizzato in TOTP è sostituito dall'ora corrente. Il client e il server rimangono sincronizzati finché i tempi di sistema rimangono gli stessi. Questo può essere fatto usando Network Time protocol .

La chiave segreta (così come il contatore nel caso di HOTP) deve essere comunicata al server e al client in un determinato momento. Nel caso di Google Authenticator, questo viene fatto sotto forma di un URI codificato QRCode. Vedere: KeyUriFormat per ulteriori informazioni.

197
user10211

di lavoro:

Authenticator implementa l'algoritmo Time-Based One-Time Password (TOTP). Ha i seguenti ingredienti:

• Un segreto condiviso (una sequenza di byte)

• Un input derivato dall'ora corrente

• Una funzione di firma

Segreto condiviso: Il segreto condiviso è ciò che è necessario ottenere per configurare l'account sul telefono. O scatti una foto di un codice QR usando il tuo telefono o puoi inserire il segreto manualmente.

Input (Ora corrente): Il valore del tempo di input che otterrai semplicemente dal tuo telefono, non è necessaria alcuna ulteriore interazione con il server una volta ottenuto il segreto. Tuttavia, è importante che l'ora del telefono sia precisa poiché il server ripeterà essenzialmente ciò che accade sul telefono utilizzando l'ora corrente nota dal server.

Funzione di firma: La funzione di firma utilizzata è HMAC-SHA1. HMAC sta per codice di autenticazione dei messaggi basato su Hash ed è un algoritmo che utilizza una funzione hash unidirezionale sicura (SHA1 in questo caso) per firmare un valore. L'uso di un HMAC ci consente di verificare l'autenticità: solo le persone che conoscono il segreto possono generare lo stesso output per lo stesso input (l'ora corrente).

Algoritmo OTP:

Codice pseudo:

original_secret = xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx

secret = BASE32_DECODE(TO_UPPERCASE(REMOVE_SPACES(original_secret)))

input = CURRENT_UNIX_TIME() / 30  // sets a constant value for 30 seconds

hmac = SHA1(secret + SHA1(secret + input)) //apply hashing

offset = hmac[len(hmac)-1] & 0x0F //Last nibble

four_bytes = hmac[offset : offset+4] //takes a subset of 4 bytes from 20 bytes

large_integer = INT(four_bytes) //Covert four bytes to integer

small_integer = large_integer % 1,000,00 //gives 6 digit code

enter image description here

Riferimento: https://garbagecollected.org/2014/09/14/how-google-authenticator-works/

Dai un'occhiata anche a questo progetto github per l'implementazione GO: https://github.com/robbiev/two-factor-auth/blob/master/main.go

45
Arjun

Funzionerà su un seed in base al tempo, quindi è simile al modo in cui funzionano i portachiavi RSA. cioè non richiedono alcuna connettività.

Ho appena dato un'occhiata in giro e questa è una risposta qui: https://stackoverflow.com/questions/8340495/how-rsa-tokens-works

15
AndyMac

Se uno strace è il demone sshd, si può vedere come il server 'sa' della chiave segreta, mentre legge il file di configurazione degli utenti:

#strace -f -v -e open /usr/sbin/sshd -p 2222 -dddd -f /etc/ssh/sshd_config 2>&1 | grep -i goog


> > [pid  2105] open("/home/myuser/.google_authenticator", O_RDONLY) = 4
> > [pid  2105] open("/home/myuser/.google_authenticator~",
> > O_WRONLY|O_CREAT|O_EXCL|O_TRUNC|O_NOFOLLOW, 0400debug3:
> > mm_sshpam_respond: pam_respond returned 1 [preauth]

Il cellulare lo sa già; l'hai scannerizzato tramite QR o digitato.

0
james6125