Questo è un clone di una domanda che ho postato su Stack Exchange. Ho pensato che avrei potuto catturare l'attenzione di alcune persone diverse che potrebbero aiutarti qui.
Stiamo cercando di implementare un protocollo di password monouso basato su hmac per utilizzare l'autenticazione degli utenti sulla nostra API.
L'idea è di crittografare un identificatore univoco per l'utente (uid) contro una chiave privata e un contatore incrementale. Quindi incrementa il contatore per la prossima chiamata.
encrypt(uid, private_key, counter)
# now increment the counter for the next call
Quindi sul lato server, decrittografare utilizzando la chiave privata e il contatore per ottenere l'identificativo utente (uid).
decrypt(encrpyted_string, private_key, counter)
# now increment the counter for the next received request
Funziona bene. Ogni chiamata è completamente unica (una volta) a causa del contatore.
Tuttavia come gestiremo la sincronizzazione del contatore? Cosa succede se il client genera una richiesta, incrementa il contatore per la prossima chiamata e invia la richiesta, ma il server è offline e non riceve mai la richiesta, oppure c'è un problema di connettività Internet e la richiesta non arriva mai: ora il server e il client non è sincronizzato con i contatori reciproci.
Si tratta di un caso di "dovresti sapere se è stata inoltrata una richiesta"? Cioè potremmo aggiungere un'intestazione di risposta dal server per dire se il contatore è stato incrementato e solo se lo ha fatto incrementiamo il contatore anche nell'app ... ma poi lo stesso si potrebbe dire al contrario - potremmo inviare un richiesta, il server la riceve, incrementa il proprio contatore e invia una risposta, ma la connessione Internet è stata interrotta mentre il server stava elaborando la sua richiesta e l'app non riceve mai la risposta, non incrementa mai il suo contatore e quindi i due non sono sincronizzati ancora una volta.
Grazie per le informazioni che mi puoi dare.