Prevenzione dei dispositivi che utilizzano lo stesso segreto OTP

1

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:

  1. L'app genera una chiave di protezione segreta unica alla prima esecuzione
  2. L'app invia la chiave di protezione segreta al server
  3. Il server genera un segreto univoco per l'app
  4. Il server crittografa il segreto utilizzando la chiave di protezione segreta dall'app e restituisce il BLOB all'app
  5. L'app decodifica le informazioni utilizzando la chiave generata e inizia a generare OTP
  6. 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)?
posta rcorreia 20.07.2017 - 17:25
fonte

3 risposte

2

Comprendo perfettamente la tua esigenza, dal momento che la scansione del codice QR con Google Authenticators KeyURI determinerà "copie" del possesso dell'autenticazione.

Interessante abbastanza c'è un RFC per questo: link Ma il mio sospetto è che questo potrebbe essere un bit overkill.

Sto lavorando al nostro server di autenticazione che oltre a molti altri dispositivi di autenticazione supporta anche app per smartphone come Google Authenticator che eseguono la scansione del segreto OTP in "testo normale". Come detto, non mi piace molto, quindi abbiamo anche iniziato a pensare a migliorare il processo di implementazione. Questi sono i nostri temi finora: link

In sostanza, vogliamo essere in grado di registrare uno smartphone senza connessione a Internet. A volte lo smartphone non ha una connessione o, a volte, il server di autenticazione, dove viene registrato il token, non è accessibile dallo smartphone, ma solo dal client desktop. Quindi abbiamo pensato di affidarci ancora al QR Code.

Ma invece di trasportare solo la chiave segreta all'interno del QR Code e rendere così il token copiabili su molti smartphone, abbiamo bisogno di un secondo componente generato dallo smartphone. Il modo più semplice è questo:

  1. Il server di autenticazione fornisce il primo compoment della chiave segreta in un codice QR
  2. L'utente esegue la scansione di questo codice QR con la sua nuova app lucida
  3. L'app genera il secondo componente e semplicemente visualizza questo all'utente.
  4. L'utente digita questo secondo componente nella pagina di registrazione del server di autenticazione.
  5. Entrambi, il server e l'app per smartphone calcolano l'ultima chiave segreta in base al componente generato dal server e al componente generato dall'app dello smartphone.

Inoltre : il flusso di lavoro è piuttosto semplice e non soggetto a errori

Meno : un utente malvagio potrebbe ancora annotare il primo componente del server e il secondo componente generato dallo smartphone e "manualmente" calcolare la chiave segreta e utilizzare questa chiave segreta su diverse app per smartphone . Ma questo è ancora un processo brutto. L'obiettivo principale era proteggere gli utenti pigri e malvagi, che potevano semplicemente chiedere al loro collega: "Ehi, scannerizza anche il mio token".

Sono curioso, cosa ne pensi di questo. Se ti piace, seguici su github o contribuisci, forse questa potrebbe essere una soluzione anche per te.

    
risposta data 10.08.2017 - 22:04
fonte
4

Se stai progettando la tua app di autenticazione; invece di eseguire la scansione del token OTP, eseguire la scansione di un token di autorizzazione che verrà quindi utilizzato per recuperare l'OTP da un server. Il server può quindi essere configurato per rilasciare il token una sola volta. Certificato di bundle che si inserisce nella tua applicazione e anche tu sei bravo.

Il flusso sarebbe simile a questo.

  • L'utente richiede il token OTP dal sito web
  • L'utente apre l'app e scansiona il codice QR, che contiene un codice API utilizzabile una sola volta
  • L'app contatta quindi il server, verifica il certificato con cert spillato
  • L'app invia una chiave API utilizzabile una sola volta, il server restituisce il token OTP e contrassegna la chiave API come defunta.
risposta data 20.07.2017 - 18:06
fonte
2

Potresti voler utilizzare l'ID del dispositivo per implementare un segreto deterministico unico per dispositivo come descritto nella RFC 4226 , nulla impone il segreto da trasmettere (ma si consiglia di utilizzare la generazione casuale).

 We distinguish two different cases:

      - A single master key MK is used to derive the shared secrets;
        each HOTP device has a different secret, K_i = SHA-1 (MK,i)
        where i stands for a public piece of information that identifies
        uniquely the HOTP device such as a serial number, a token ID,
        etc.  Obviously, this is in the context of an application or
        service -- different application or service providers will have
        different secrets and settings.

In alternativa allo scenario della chiave casuale generata alla prima esecuzione, l'app può utilizzare il dispositivo uuid come chiave di crittografia nei tuoi 1 e 2, il che rende più difficile la riproduzione su un altro dispositivo.

    
risposta data 20.07.2017 - 17:49
fonte

Leggi altre domande sui tag