Sto provando a costruire il mio REST Api basato su PHP per la mia app per Android e sono un po 'confuso da tutte le diverse funzionalità di autenticazione degli utenti che si possono trovare su Internet. Quindi voglio presentare le mie considerazioni sulla sicurezza e sarei lieto di alcuni feedback.
In primo luogo, voglio chiarire che non voglio creare un'API pubblica in cui terze parti possano registrarsi per una chiave API, ma voglio solo che gli utenti della mia app possano fare tutto il registro / login / invio di richieste roba. Quindi i miei piani sono i seguenti:
-
Quando un utente vuole registrarsi, la mia app scambia prima chiavi generate con il mio server usando il metodo Diffie-Hellman. Per questo, il mio server e la mia app memorizzano le informazioni sullo stesso numero primo e sulla stessa base (spesso chiamate p e g). La mia app genera quindi un segreto e crea una chiave pubblica da p, ge il segreto. La chiave pubblica viene inviata al server, che risponde inviando un ID utente nel formato UUID Java e la chiave pubblica del server in base al segreto del server, p e g. Alla fine, entrambe le parti sono in grado di generare un segreto comune. L'intera transazione viene eseguita utilizzando TSL / SSL e può essere visualizzata qui . Invece del numero intero, piuttosto lungo segreto, un hash SHA-512 è memorizzato nel database e nell'app.
-
Dopo aver scambiato la chiave, ora posso inviare le informazioni dell'account dell'utente (userid, password e altre cose) al server usando TSL / SSL. Il segreto dell'app viene utilizzato per HMAC assicurandosi che l'istanza dell'app (l'utente) sia autorizzata a inviarmi questa roba. Posso verificarlo mentre memorizzo il hash segreto SHA-512 e l'userid nel database. La password deve essere trasmessa per poter accedere nuovamente se l'utente si è disconnesso o desidera modificare la sua password. La password viene cancellata con follwowing queste istruzioni. Dopo l'accesso, un token di accesso casuale viene restituito all'utente che rappresenta il suo stato di accesso. Questo token di accesso è anche memorizzato nel database.
-
Invece di inviare le credenziali dell'utente ad ogni richiesta, il token di accesso viene utilizzato come credenziali di accesso e il segreto generato nel primo passaggio viene utilizzato per eseguire HMAC. Quindi, se ottengo una richiesta, posso prima verificare se l'utente è autorizzato a inviarmi una richiesta eseguendo l'autenticazione del messaggio con HMAC e quindi posso verificare se l'utente è loggato confrontando il token di accesso trasmesso con quello memorizzato nel Banca dati. Questa transazione può anche essere eseguita con TSL / SSL ma non è necessario.
È un concetto valido o manca di alcuni punti cruciali, contiene incomprensioni o c'è qualche altro tipo di problema?