La società per cui lavoro è la creazione di un'app mobile che comunica con due API.
La prima API è di nostra proprietà. Tra le altre cose, gestisce l'autorizzazione e l'autenticazione in stile OAuth2.
La seconda API non è di nostra proprietà. È un'origine dati di terze parti che offre solo l'autorizzazione tramite le intestazioni di autenticazione HTTPS di base. Ogni richiesta a questa API deve includere un nome utente e una password. Le credenziali di accesso per la seconda API sono diverse dalle credenziali per la prima API.
Vorremmo memorizzare le credenziali degli utenti per la seconda API in modo che l'utente non debba reinserire il proprio nome utente e password ogni volta che apre la nostra app mobile e fa una richiesta alla seconda API.
Abbiamo ideato la seguente soluzione:
-
L'utente apre la nostra app mobile e autentica con la prima API (sto saltando i dettagli dell'autenticazione con la prima API perché non è rilevante per il problema principale).
-
L'utente inserisce il nome utente e la password per la seconda API.
-
L'app per dispositivi mobili genera una chiave privata PGP, una chiave pubblica e una passphrase casuale per la chiave privata.
-
L'app mobile crittograferebbe quindi il nome utente e la password per la seconda API utilizzando la chiave pubblica.
-
L'app mobile carica la chiave privata, il nome utente crittografato e la password crittografata sulla prima API. La prima API memorizza quei valori su una tabella utenti .
-
La chiave pubblica viene scartata dal dispositivo. La passphrase per la chiave privata viene memorizzata nel modo più sicuro possibile sul dispositivo (portachiavi del dispositivo se disponibile).
-
Le richieste precedentemente inviate dall'app mobile alla seconda API vengono ora instradate tramite la prima API. La richiesta includerà la passphrase (memorizzata solo sul dispositivo mobile) in modo che la prima API possa utilizzare la chiave privata per decodificare il nome utente e la password e inviare la richiesta di autenticazione di base HTTP alla seconda API.
Per ottenere il nome utente e la password in testo normale, un hacker dovrebbe compromettere entrambi il dispositivo dell'utente (per ottenere la passphrase) e la nostra prima API (per ottenere la chiave privata e crittografata accesso). Anche se sia il dispositivo mobile che la nostra prima API sono stati compromessi, l'hacker otterrebbe solo una password perché ogni utente genera la propria combinazione di chiave privata / passphrase PGP.
Questo ci sembra sicuro, ma volevo fare un post qui per vedere se qualcuno poteva segnalare eventuali difetti o suggerire miglioramenti. Siamo curiosi di sapere se esiste un modo per proteggere gli scenari in cui il dispositivo mobile dell'utente viene compromesso. Allo stato attuale, se il dispositivo dell'utente fosse stato compromesso, l'hacker non avrebbe acquisito la password degli utenti ma potrebbe utilizzare la passphrase della chiave privata per inviare richieste illegittime e leggere i dati sensibili dalla seconda API.