Si sta utilizzando l'autenticazione di base in un'app per iOS sicura?

13

Sto lavorando su un'app per iOS che invierà il nome utente e la password dell'utente per ogni richiesta di URL. Attualmente, solo perché per semplicità fino a quando non è pronto per essere lanciato, il nome utente e la password vengono passati su HTTPS in una richiesta GET come quella di seguito.

https://www.example.com/api/login.php?username=user&password=pass

L'HTTPS protegge i parametri per la trasmissione, ma so che il problema di sicurezza con questo è che l'URL può essere memorizzato nella cronologia del browser e in qualsiasi registro del server.

La mia domanda è ... se mi libero di passare il nome utente e la password come sto facendo attualmente e io li codifico in base64 prima di essere inviato, includerli nell'intestazione come di seguito, è sicuro? Il nome utente e la password saranno memorizzati in qualsiasi cronologia o registro?

Authorization: Basic aHR0cHdhdGNoOmY=

EDIT: So già che base64 può essere facilmente annullato ... non è quello che sto chiedendo. Sto solo chiedendo la sicurezza di inserire nomi utente e password nei parametri GET dell'HTTPS rispetto all'intestazione.

UPDATE: Ora utilizzo l'autenticazione di base per l'endpoint di accesso e restituisco un token Web JSON da utilizzare per tutte le richieste successive.

    
posta Alec 28.12.2016 - 18:36
fonte

6 risposte

13

Will the username and password be stored in any history or logs?

Generalmente le intestazioni di autorizzazione non vengono registrate, ma, naturalmente, è possibile configurare l'applicazione o il server per registrare questi dati. Quindi controlla la tua configurazione.

Per quanto riguarda la memorizzazione nella cronologia: in caso di browser, tali credenziali non verranno memorizzate nella cronologia, ma potrebbero essere memorizzate in modo simile ai cookie e inviate automaticamente quando si visita il sito. Tuttavia, dal momento che non stai utilizzando un browser ma la tua app, sta a te decidere come gestire queste informazioni.

    
risposta data 28.12.2016 - 18:41
fonte
9

Dovresti utilizzare un token temporaneo dopo il primo scambio, per evitare di trasmettere le credenziali reali ad ogni richiesta. Pertanto, le tue app devono solo ricordare il token temporaneo, non le credenziali complete.

E sì, è meglio metterlo nelle intestazioni che nell'url:

  • url possono essere registrati dal client
  • gli URL sono probabilmente registrati dal server
  • urls potrebbe perdite ( link )
risposta data 28.12.2016 - 19:42
fonte
1

Non sono del tutto sicuro che l'OP stia chiedendo apertamente se lo schema è completamente sicuro una volta usate le intestazioni:

My question is... if I get rid of passing the username and password like I currently am doing and I base64 encode them prior to being sent, include them in the header like below, is this safe?

... o, se la domanda solo si riferisce alla registrazione lato client e non la sicurezza generale:

Will the username and password be stored in any history or logs?

Tuttavia, supponendo che la questione sia di sicurezza generale, vorrei sottolineare che sebbene l'OP stia utilizzando HTTPS, la mia comprensione è che il trasferimento delle credenziali su ogni richiesta è considerato scadente al giorno d'oggi perché gli attacchi di replay MITM sono ancora possibili (anche se è utilizzato HTTPS). Pertanto, anche quando si utilizza HTTPS, uno schema di token come JWT dovrebbe essere preferito rispetto all'utilizzo dell'autenticazione di base su richiesta.

    
risposta data 28.12.2016 - 22:43
fonte
0

is this safe?

Non particolarmente. La codifica Base64 può essere facilmente annullata.

Will the username and password be stored in any history or logs?

Forse, non è davvero possibile raccontare dalle informazioni disponibili. È, naturalmente, possibile che i dati vengano registrati in un attacco MitM.

Questo in realtà si riduce a una questione di rischio. È una buona pratica, assolutamente no. Sarebbe adatto per i record finanziari / sanitari, certamente no. Sarebbe bello quando si testava un nuovo prodotto, quasi certamente, soprattutto se non si registrano dati in tempo reale e si ripristinerà il database prima di andare in diretta.

    
risposta data 28.12.2016 - 19:32
fonte
0

Penso che il tuo approccio generale sia fondamentalmente errato. Mentre riesco a capire appieno dove ti stai formando, il tuo approccio generale è fuorviante.

Uno dei maggiori contributori allo scarso livello di sicurezza in molte applicazioni è dovuto al fatto di lasciare la sicurezza in una fase successiva piuttosto che costruirla all'inizio. Troppo spesso l'approccio è "lascia che l'app funzioni e ci occuperemo della sicurezza una volta che avremo le funzionalità di base funzionanti.

Il problema con questo approccio è che far funzionare le funzionalità di base spesso stabilisce restrizioni e guida la progettazione in modo tale da limitare le opzioni quando si tratta di sicurezza.

Questo è completamente comprensibile. Quando ti siedi a destra la nuova app killer, vuoi concentrarti sulle parti più interessanti - la funzionalità chiave che vuoi vedere e vuoi vedere progressi reali. Spesso ci sono manager e decision maker che aumentano la pressione per produrre qualcosa da vedere. Tutta questa roba di sicurezza è solo un'impalcatura che si frappone - una sorta di male necessario.

Purtroppo, troppo spesso, questo si traduce in una mancanza di enfasi sulla sicurezza. O il design rende l'aggiunta di sicurezza sufficiente, troppo dura o altre pressioni, come le scadenze di consegna, gli angoli medi vengono tagliati.

Inizia con il modello di sicurezza. Accertalo e poi inizia con la funzionalità dell'app. Risulterà in un design migliore e qualcosa che è più facile da mantenere. In questo caso specifico

  • Sì, elimina definitivamente l'approccio ai parametri GET.
  • Dimentica la codifica base64. Non ti sta davvero comprando nulla ed è probabile che crei un falso senso di sicurezza.
  • Guarda come minimizzare la necessità di inviare la password o anche il nome utente. Prendi in considerazione l'utilizzo di una sorta di token di autenticazione.
  • Assicurati che i tuoi token siano crittografati.

Ci sono molti vantaggi nell'usare un token di autenticazione piuttosto che solo nome utente e password. È possibile crittografare informazioni aggiuntive nel token, ad esempio la data di scadenza. Ho persino visto token che includono dettagli del client, come la versione del browser e le informazioni del sistema operativo, che possono essere utilizzate come un tipo di impronta digitale.

Il vantaggio principale dell'uso di un token è che il tuo unico passaggio di nomi utente e password è un numero minimo assoluto di volte. Meno hai bisogno di inviare queste informazioni, meglio è. Tuttavia, per usare i token in modo efficace e sicuro, devono essere progettati nella tua applicazione e non aggiunti successivamente.

L'altro vantaggio nel creare questo nella tua app dall'inizio è che puoi testare più facilmente i vari approcci e librerie diversi là fuori. Esistono numerose soluzioni di autenticazione e autorizzazione basate su token diverse e devi identificare quale sia la soluzione migliore per la tua architettura, lingua e piattaforma. Prendi questo giusto all'inizio e il resto andrà a posto molto più facilmente rispetto al tentativo di adattarlo retroattivamente a un codice esistente.

    
risposta data 29.12.2016 - 23:08
fonte
-1

is this safe? Will the username and password be stored in any history or logs?

Ridurrete almeno il rischio GET, poiché in genere nessun registro di intestazione viene catturato in un proxy o in un server Web.

Ma meglio usare HTTPS all'interno della tua applicazione poiché non hai per acquistare un certificato digitale se hai a che fare con il tuo web server. Puoi utilizzare l'Apposizione di certificati e il certificato autofirmato sarà abbastanza sicuro: link .

    
risposta data 28.12.2016 - 19:56
fonte

Leggi altre domande sui tag