In che modo le app popolari autenticano le richieste degli utenti dalla loro app mobile al loro server?


118

Supponiamo che io abbia un'applicazione Android che si connette a un'API .Net per la ricezione / impostazione dei dati. La confusione che ho è su come iscriversi / accedere all'utente per la prima volta e autenticarlo ogni volta che effettua una richiesta all'API.

  • Se utilizzo solo l'autenticazione basata su nome utente / password non saranno abbastanza sicuri?
  • E non posso salvare quel nome utente / password nel dispositivo per ovviamente motivi di sicurezza?
  • Devo emettere un GUID per ogni utente al momento della registrazione, salvarlo nel suo dispositivo e recuperarlo ogni volta durante una richiesta API?

Quali altri modelli sono disponibili e quali sono i più efficienti e sicuri, ho solo bisogno di un flusso di processo per questo. Qualcuno può dirmi quale metodo utilizzano famose applicazioni Android come Facebook, FourSquare o Twitter per autenticare ogni richiesta proveniente dalla loro applicazione mobile sul loro server?

Scusa in anticipo se non si tratta di un'informazione pubblica.

Risposte:


48

Immagino che utilizzino un sistema di sicurezza basato su "token", quindi la password in realtà non viene mai memorizzata da nessuna parte, solo usata la prima volta per l'autenticazione. Quindi l'app inizialmente pubblica il nome utente / password (su ssl) e il server restituisce un token che l'app memorizza. Per i successivi tentativi di sincronizzazione, il token viene inviato per primo, il server verifica che sia valido e quindi consente la pubblicazione di altri dati.

Il token dovrebbe avere una scadenza in modo che il server possa richiedere nuovamente un tentativo di autenticazione.

Se ti colleghi all'adattatore di sincronizzazione dall'interno di Android Framework, questo ti darà la possibilità di sincronizzare e autenticare tutto sotto il cofano.

http://developer.android.com/training/sync-adapters/creating-sync-adapter.html

Se controlli gli account in Impostazioni sul tuo dispositivo vedrai cosa intendo.


19

Fondamentalmente questi famosi usano il protocollo OAuth (1) / framework (2). Anche se deve essere uno standard, ognuno di questi ha implementazioni diverse di questo protocollo / framework. Quindi dobbiamo stare molto attenti quando si tratta di integrazione.

Esempio: Dropbox utilizza ancora OAuth 1 e di recente ha sviluppato il supporto OAuth 2.

Tornando alla risposta, come ha affermato Peterpan, il suo è un metodo di autenticazione basato su token che è una cosa unica e fuori dall'equazione. Questi token sono scaduti o in alcuni casi il potere è dato allo sviluppatore.

La cosa interessante è che è possibile definire l'ambito di accesso alle risorse piuttosto che consentire all'applicazione client di mantenere i nomi utente e le password, il che è pericoloso.

Questa è l'illustrazione di base di come funziona.

inserisci qui la descrizione dell'immagine

Aggiornerò la risposta dopo aver ottenuto maggiori dettagli su questo, dato che sto lavorando in quest'area in questi giorni :)


13

Se utilizzo solo l'autenticazione basata su nome utente / password non saranno abbastanza sicuri?

No, perché si identifica solo l' OMS sta accedendo al server API, ma non l' COSA sta accedendo.

La differenza tra CHI e COSA è l'accesso al server API

Per comprendere meglio le differenze tra WHO e COSA stanno accedendo a un server API, usiamo questa immagine:

Man in the Middle Attack

Il canale di comunicazione previsto rappresenta l'app mobile utilizzata come previsto, da un utente legittimo senza intenzioni dannose, utilizzando una versione non manomessa dell'app mobile e comunicando direttamente con il server API senza essere attaccati da uomo nel mezzo.

Il canale effettivo può rappresentare diversi scenari diversi, come un utente legittimo con intenzioni dannose che potrebbe utilizzare una versione riconfezionata dell'app mobile, un hacker che utilizza la versione originale dell'app mobile, mentre un uomo nel mezzo l'attacca, per capire come la comunicazione tra l'app mobile e il server API viene eseguita per poter automatizzare gli attacchi contro la tua API. Sono possibili molti altri scenari, ma non li enumereremo qui.

Spero che a questo punto abbiate già un'idea del perché l' OMS e il COSA non sono la stessa cosa, ma in caso contrario diventerà chiaro in un attimo.

L' OMS è l'utente dell'app mobile che possiamo autenticare, autorizzare e identificare in diversi modi, come utilizzando OpenID Connect o flussi OAUTH2.

OAuth

In genere, OAuth fornisce ai client un "accesso delegato sicuro" alle risorse del server per conto del proprietario della risorsa. Specifica un processo per i proprietari delle risorse per autorizzare l'accesso di terze parti alle risorse del server senza condividere le proprie credenziali. Progettato specificamente per funzionare con il protocollo HTTP (Hypertext Transfer Protocol), OAuth consente essenzialmente di emettere token di accesso a client di terze parti da un server di autorizzazione, con l'approvazione del proprietario della risorsa. La terza parte utilizza quindi il token di accesso per accedere alle risorse protette ospitate dal server di risorse.

OpenID Connect

OpenID Connect 1.0 è un semplice livello di identità in cima al protocollo OAuth 2.0. Consente ai Clienti di verificare l'identità dell'Utente finale in base all'autenticazione eseguita da un Server di autorizzazione, nonché di ottenere informazioni di base sul profilo dell'Utente finale in modo interoperabile e simile a REST.

Sebbene l'autenticazione dell'utente possa consentire al server API di sapere CHI sta utilizzando l'API, non può garantire che le richieste abbiano avuto origine da COSA ti aspetti, la versione originale dell'app mobile.

Ora abbiamo bisogno di un modo per identificare COSA sta chiamando il server API, e qui le cose diventano più complicate di quanto la maggior parte degli sviluppatori possa pensare. Il WHAT è la cosa che fa la richiesta al server API. È davvero un'istanza autentica dell'app mobile o è un bot, uno script automatizzato o un aggressore che fruga manualmente con il server API, utilizzando uno strumento come Postman?

Con tua sorpresa potresti scoprire che può essere uno degli utenti legittimi che utilizza una versione riconfezionata dell'app mobile o uno script automatizzato che sta cercando di gamify e sfruttare il servizio fornito dall'applicazione.

Bene, per identificare il COSA , gli sviluppatori tendono a ricorrere a una chiave API che di solito codificano nel codice della loro app mobile. Alcuni sviluppatori fanno il possibile e calcolano la chiave in fase di esecuzione nell'app mobile, quindi diventa un segreto di runtime rispetto al primo approccio quando un segreto statico è incorporato nel codice.

Il precedente articolo è stato estratto da un articolo che ho scritto, intitolato PERCHÉ LA TUA APP MOBILE HA BISOGNO DI UNA CHIAVE API? , e che puoi leggere per intero qui , questo è il primo articolo di una serie di articoli sulle chiavi API.

Archiviazione di dati sensibili nel dispositivo client

E non posso salvare quel nome utente / password nel dispositivo per ovviamente motivi di sicurezza? Devo emettere un GUID per ogni utente al momento della registrazione, salvarlo nel suo dispositivo e recuperarlo ogni volta durante una richiesta API?

Tutto ciò che salvi nel dispositivo, anche se crittografato, può essere decodificato durante il runtime con strumenti come Frida o Xposed.

frida

Inietta i tuoi script nei processi della scatola nera. Aggancia qualsiasi funzione, spia le API crittografiche o traccia il codice di applicazioni private, non è necessario alcun codice sorgente. Modifica, premi Salva e visualizza immediatamente i risultati. Tutto senza passaggi di compilazione o riavvio del programma.

Xposed

Xposed è un framework per moduli in grado di modificare il comportamento del sistema e delle app senza toccare alcun APK. È fantastico perché significa che i moduli possono funzionare per diverse versioni e persino ROM senza alcuna modifica (purché il codice originale

In un dispositivo che l'attaccante controlla può anche utilizzare un proxy per eseguire un Man in the Middle Attack per estrarre qualsiasi segreto tu possa usare per identificare il COSA o l' OMS come mostro nell'articolo Rubare quella chiave API con un Man in the Attack :

Sebbene sia possibile utilizzare tecniche avanzate, come JNI / NDK, per nascondere la chiave API nel codice dell'app mobile, ciò non impedirà a qualcuno di eseguire un attacco MitM per rubare la chiave API. In effetti, un attacco MitM è facile al punto che può essere ottenuto anche da non sviluppatori.

Quindi ora cosa ... Sono condannato al punto da non poter proteggere il mio server API da abusi ??? Nessun silenzio quindi ... la speranza esiste ancora !!!

Possibili soluzioni

Qualcuno può dirmi quale metodo utilizzano famose applicazioni Android come Facebook, FourSquare o Twitter per autenticare ogni richiesta proveniente dalla loro applicazione mobile sul loro server?

Scusa ma non ho abbastanza conoscenze su questa app per poterti spiegare, ma posso indicarti altri approcci.

Quali altri modelli sono disponibili e quali sono i più efficienti e sicuri, ho solo bisogno di un flusso di processo per questo.

Quindi tutto ciò che viene eseguito sul lato client e necessita di qualche segreto per accedere a un'API può essere utilizzato in modi diversi e puoi saperne di più su questa serie di articoli sulle tecniche di sicurezza delle API mobili. Questo articolo ti insegnerà come utilizzare chiavi API, token di accesso utente, HMAC e TLS Pinning per proteggere l'API e come aggirarli.

Per risolvere il problema di COSA sta accedendo alla tua app mobile devi utilizzare una o tutte le soluzioni menzionate nella serie di articoli sulle tecniche di sicurezza delle API mobili che ho menzionato sopra e ho accettato che possono solo rendere più difficile l'accesso non autorizzato al tuo server API bypass ma non impossibile.

Una soluzione migliore può essere impiegata utilizzando una soluzione di attestazione dell'app mobile che consentirà al server API di sapere che sta ricevendo solo richieste da un'app mobile autentica.

Attestazione per app mobile

L'utilizzo di una soluzione di attestazione dell'app mobile consentirà al server API di sapere COSA sta inviando le richieste, consentendo così di rispondere solo alle richieste provenienti da un'app mobile autentica rifiutando tutte le altre richieste da fonti non sicure.

Il ruolo di una soluzione di attestazione dell'app mobile è garantire in fase di esecuzione che la tua app mobile non sia stata manomessa, non sia in esecuzione su un dispositivo rooted, non sia strumentata da un framework come xPosed o Frida, non sia attaccata da MitM e questo si ottiene eseguendo un SDK in background. Il servizio in esecuzione nel cloud metterà alla prova l'app e, in base alle risposte, attesterà l'integrità dell'app mobile e del dispositivo in esecuzione, quindi l'SDK non sarà mai responsabile di alcuna decisione.

In caso di corretta attestazione dell'integrità dell'app mobile, viene emesso un token JWT di breve durata e firmato con un segreto che solo il server API e il servizio di attestazione dell'app mobile nel cloud sono a conoscenza. In caso di errore sull'attestazione dell'app mobile il token JWT viene firmato con un segreto che il server API non conosce.

Ora l'App deve inviare con ogni chiamata API il token JWT nelle intestazioni della richiesta. Ciò consentirà al server API di servire solo le richieste quando può verificare la firma e l'ora di scadenza nel token JWT e rifiutarle quando fallisce la verifica.

Una volta che il segreto utilizzato dal servizio di attestazione dell'app mobile non è noto dall'app mobile, non è possibile decodificarlo in fase di esecuzione anche quando l'app viene manomessa, in esecuzione in un dispositivo rooted o comunicando su una connessione che è il bersaglio di un Man in the Middle Attack.

Il servizio di attestazione dell'app mobile esiste già come soluzione SAAS presso Approov (lavoro qui) che fornisce SDK per diverse piattaforme, tra cui iOS, Android, React Native e altre. L'integrazione richiederà anche un piccolo controllo nel codice del server API per verificare il token JWT emesso dal servizio cloud. Questo controllo è necessario affinché il server API sia in grado di decidere quali richieste servire e quali negare.

Conclusione

Alla fine, la soluzione da utilizzare per proteggere il tuo server API deve essere scelta in base al valore di ciò che stai cercando di proteggere e ai requisiti legali per quel tipo di dati, come le normative GDPR in Europa.

VUOI FARE UN MIGLIO EXTRA?

OWASP Mobile Security Project - Top 10 rischi

Il progetto OWASP Mobile Security è una risorsa centralizzata intesa a fornire agli sviluppatori e ai team di sicurezza le risorse necessarie per creare e mantenere applicazioni mobili sicure. Attraverso il progetto, il nostro obiettivo è classificare i rischi per la sicurezza mobile e fornire controlli di sviluppo per ridurne l'impatto o la probabilità di sfruttamento.



3

Sono un principiante ma cercherò di dare una soluzione logica alla domanda data.

Ci saranno due opzioni, [1] Per ogni URI, verrà eseguita l'autenticazione http in cui verranno verificate le credenziali inserite dall'utente e l'utente accederà alle risorse.

[2] Un altro approccio potrebbe essere, un utente deve autenticare e su ogni autenticazione verrà generato un token univoco. Utilizzando il token generato, l'utente accederà alle risorse.

Anche se non sono sicuro di quale approccio potrebbe essere più adatto per l'applicazione mobile.


3

L'esempio di autenticazione è un buon punto di partenza. Android memorizza le credenziali in Account Manager, puoi visualizzare gli account nelle impostazioni di Android. Questo memorizzerà automaticamente i token, richiederà all'utente le credenziali se scadute o mancanti, aggiornerà i token ecc. Trovo la parte http di questo esempio mancante o vecchia. L'estensione di AccountAuthenticatorActivity di Android è un ottimo aiuto per analizzare i dati serializzati sul layout e di nuovo su Internet.


-7

Il nome utente e le password possono essere al sicuro se inseriti in SharedPreferences. Anche l'uso di https nella connessione a un server dovrebbe essere abbastanza buono.


Puoi utilizzare SharedPreferences ma i tuoi dati non sono crittografati per impostazione predefinita. Se sei preoccupato per questo, vedi ad esempio questa discussione su SO: stackoverflow.com/questions/785973/…
Michael Helwig

3
SharedPreferences non è un luogo sicuro in cui archiviare le credenziali. Qualsiasi dispositivo rooted (che non è difficile da fare) esporrà quelle credenziali. Utilizza invece l'API dell'account integrata.
Brill Pappin

Le SharedPreferences possono essere scaricate anche da un dispositivo senza root, cosa che se non sbaglio è possibile tramite il meccanismo di backup del sistema Android. Esistono diversi strumenti per ottenere file leggibili da un file di backup di Android.
Darthmail

@BrillPappin Domanda sul tuo commento. Le credenziali archiviate sono l'email e la password dell'utente, oltre a un token da inviare che rappresenta l'autenticazione corrente con quell'email. Se l'utente sceglie di esporre a se stesso le proprie credenziali, tramite il rooting, qual è il rischio?
ToolmakerSteve

Il rischio è duplice. 1) tutti i dati sensibili facilmente accessibili che devi presumere saranno accessibili. Potrebbe non interessarti davvero, ma qualcun altro potrebbe. 2) la memorizzazione di una passphrase non è sicura.
Brill Pappin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.