Autenticazione dell'applicazione mobile tramite UUID

1

Scrivo codice di back-end per applicazioni mobili. Ho bisogno di scrivere il codice per l'autenticazione e la soluzione più semplice e sicura che riesca a pensare è:

  • All'accesso dell'utente, il dispositivo invia nome utente e password al server
  • Se le credenziali sono server validi restituisce token
  • L'utente invia token con ogni richiesta

Dettagli sul token

  • In Java posso creare il token come UUID (che viene creato usando SecureRandom sotto il cofano)
  • Scrivo questo token nel DB nella tabella users nella riga utente
  • Su ogni richiesta di applicazione mobile faccio SELECT ... FROM users WHERE token = ? e controllo se l'utente corrente è autorizzato a eseguire l'operazione
  • Periodicamente cambio token in users tabella per scadere con il token precedente

Va bene?

Sembra sicuro, ma non sono un esperto di sicurezza quindi ho pensato di chiedere qui. Non ho mai visto questa soluzione prima e mi chiedo perché.

  • Qualcuno si lamenterebbe delle prestazioni a causa del colpire DB ogni volta, ma nell'applicazione reale ogni richiesta genera molte query SQL, quindi un altro non dovrebbe essere un problema.
  • Qualcuno potrebbe lamentarsi di UUID, ma per quanto ne so in Java UUID s si presume impossibile da indovinare a causa dell'implementazione di SecureRandom .

Questa soluzione è sicura o ci sono buchi che non riesco a vedere?

    
posta guest 18.09.2018 - 15:40
fonte

1 risposta

2

Ho una preoccupazione principale per il tuo setup: Dovresti cancellare i token UUID! Altrimenti, se il tuo database perde tutti gli account saranno esposti. Data la quantità di entropia in un UUID generato in modo sicuro, una semplice funzione di hash come SHA-256 farà il lavoro.

Alcuni punti minori.

L'utilizzo di un UUID come autenticazione non è sbagliato dal punto di vista della sicurezza, purché sia sicuro al 100% che utilizzi una fonte casuale sicura (e il Javadoc sembra essere d'accordo con te su questo). Per rendere il codice più esplicito, personalmente genererei il token direttamente dalla sorgente casuale senza mescolare in alcun UUID. Ma questo è principalmente per rendere il codice più pulito.

Assicurati di utilizzare un UUID versione 4. Le altre versioni non sono casuali!

Inoltre, manterrei i token in una tabella separata e non nella tabella users . Ma questo è più sulla normalizzazione del database che sulla sicurezza.

Dovresti pensare a quando espiri token. Se si dispone di una sorta di funzione di disconnessione, il token dovrebbe scadere quando l'utente si disconnette. Allo stesso modo, se l'utente viene disconnesso quando l'app viene chiusa, il token dovrebbe scadere quando l'app viene chiusa.

    
risposta data 18.09.2018 - 15:53
fonte

Leggi altre domande sui tag