Autenticatore di Google - Basato sul contatore [duplicato]

2

Sto cercando di capire come google authenticator: il lavoro basato sul contatore. Ho provato googling a trovare una demo o almeno come funziona. Capisco che sia una password unica, ma non come TOTP. Sto già lavorando su TOTP ma ho terribilmente problemi con la sincronizzazione dell'orario, perché sto lavorando su un PC offline. Quindi il tempo di Windows - beh ogni 2 giorni circa il tempo continua a spostarsi di due o tre secondi avanti.

Comunque, sto cercando un codice PHP per il contatore HOTP basato. Ho trovato uno o due esempi ma hanno così tanti file mancanti.

Per favore, mi piacerebbe trovare un tutorial su questo in PHP o almeno un'idea base per iniziare. Ho trovato questo link .

    
posta Alihamra 29.09.2013 - 23:17
fonte

2 risposte

1

TOTP è in effetti una variante basata sul tempo di HOTP . In entrambi i casi, la sequenza di possibili password deriva da una chiave segreta e da un "valore di modifica". Con TOTP, il "valore variabile" è l'ora corrente, che entrambi i fini del protocollo presumibilmente sanno (l'ora corrente è di dominio pubblico). In HOTP, il "valore di modifica" è un contatore, che viene incrementato dopo l'uso. Entrambe le parti (client e server) ricordano l'ultimo valore del contatore utilizzato.

Se il client e il server vengono desincronizzati (ad esempio il client ha inviato una password e incrementato il contatore, ma un problema di rete ha interrotto la connessione e il server non lo ha mai ricevuto), esiste un processo per la risincronizzazione: dopo aver ricevuto una password, il server non lo confronta con la password successiva (in base al suo contatore), ma con le successive 100 password, consentendo così una contro-desincronizzazione di un 100 circa.

Questo meccanismo è adatto alle chiavi della macchina, che:

  • Non hai una fonte di tempo comune (nessun orologio nella chiave).
  • È necessario lavorare con una comunicazione unidirezionale (dalla chiave alla macchina, non viceversa).
  • Avere una "risincronizzazione manuale" se non è andata bene (il nipote di 3 anni ha giocato con la chiave per un intero pomeriggio, ottenendo la chiave contro il bancone della macchina, anche con l'offset +100; non si apre più l'auto da remoto, ma quando si accende il motore, l'automobile e la chiave comunicano attraverso la RF a corto raggio per ripristinare i contatori).

Come per il codice, una semplice richiesta google su "hotp php" punta a questo e che

    
risposta data 30.09.2013 - 13:23
fonte
1

Non ho codice PHP per te, ma qui c'è un progetto che ho usato per portarlo a uno dei miei sistemi legacy delle aziende perché non c'erano porte dirette a cui potessi fare riferimento. È in C # e probabilmente puoi usarlo come pseudocodice. Sono stato in grado di eseguire il progetto C # sulla mia macchina e aggiungere punti di interruzione per assicurarmi che il mio programma avesse lo stesso risultato in ogni fase del processo. I risultati sono compatibili con Google Authenticator. GoogleAuthCSharp

Ecco come funziona a un livello elevato

  1. Ottieni il codice di tempo unix corrente, diviso in incrementi di 30 secondi. Invertire l'ordine dei bit.
  2. Ottieni / genera una chiave univoca per questo utente utilizzando un PRNG.
  3. Genera un SHA1-HMAC utilizzando il timestamp invertito e il codice utente come input.
  4. Acquisisci 4 bit specifici da HMAC. Questi sono elaborati singolarmente usando "AND" e turni bit a bit.
  5. Fai un "OR" bit a bit su questi 4 elementi insieme. Questo genera un grande risultato intero.
  6. Esegui una divisione modulare di questo intero lungo utilizzando 1000000. Ciò risulta nel TOTP a 6 cifre.

Vedi il file MainWindow.xaml.cs per il codice effettivo.

    
risposta data 30.09.2013 - 14:47
fonte

Leggi altre domande sui tag