Ho un requisito per le applicazioni OTP su dispositivi mobili che non condividono lo stesso segreto (anche se i dispositivi mobili appartengono allo stesso utente). Un singolo segreto deve essere presente in un singolo dispositivo.
Le applicazioni open source che implementano OTP (come Google Authenticator e FreeOTP) non soddisfano il mio requisito: il segreto non è un dispositivo unico, perché posso scansionare il QR-Code con più di un dispositivo e backend non lo sapremo mai riguardo a questo. Penso che non sia qualcosa legato all'applicazione stessa, ma con RFC 4226 che non specifica questo requisito.
Quindi ho pensato a un processo per attenuare il rischio che gli utenti usassero il segreto OTP in più di un dispositivo (necessità di connessione a Internet - non un requisito essere offline). I passaggi:
- L'app genera una chiave di protezione segreta unica alla prima esecuzione
- L'app invia la chiave di protezione segreta al server
- Il server genera un segreto univoco per l'app
- Il server crittografa il segreto utilizzando la chiave di protezione segreta dall'app e restituisce il BLOB all'app
- L'app decodifica le informazioni utilizzando la chiave generata e inizia a generare OTP
- Sia la chiave segreta che quella segreta di protezione cifrata verrebbero archiviate nell'app
So che questo approccio non è a prova di manomissione e il segreto potrebbe essere ripristinato dallo storage ma sarebbe più difficile.
A proposito di tutto spiegato qui, le mie domande sono:
- Sarebbe un buon approccio scambiare il segreto di OTP attraverso il web, anche se è protetto da TLS?
- L'esclusiva protezione segreta aggiunge sicurezza o un difetto al processo?
- Sarebbe possibile ottenere un risultato simile in una sincronizzazione offline?
- Esistono framework open source per ottenere una migliore protezione della chiave segreta ( cioè non esponendo direttamente all'utente, come fa QR-Code)?