2009-12-18 24 views
151

Se voglio memorizzare il nome utente e la password da utilizzare all'interno di un'applicazione Android, qual è il modo migliore per farlo? È attraverso la schermata delle preferenze (ma cosa succede se l'utente lo manca?), O fa apparire una finestra di dialogo e chiede all'utente le credenziali? Se è così, devo mantenere lo stato per l'applicazione. Come lo farei?Android: memorizzando nome utente e password?

+2

http://stackoverflow.com/a/786588/1166727 Controlla per cosa (piombo Tech per lo sviluppo Android di Google) @RetoMeier ha da dire su questo. –

+0

Se stai cercando il modo più sicuro per archiviare le credenziali. Leggi questa risposta http://stackoverflow.com/a/20560574/730807 –

+2

@Legenda come hai risolto il problema? – Erum

risposta

96

La maggior parte delle app per Android e iPhone che ho visto utilizzano una schermata iniziale o una finestra di dialogo per chiedere le credenziali. Penso che sia difficile per l'utente dover reinserire il proprio nome/password spesso, quindi archiviare tali informazioni ha senso dal punto di vista dell'usabilità.

Il parere del (Android dev guide) è:

In generale, si consiglia di ridurre al minimo la frequenza di chiedere per l'utente credenziali - per rendere gli attacchi di phishing più cospicua, e meno probabilità di avere successo. Utilizzare invece un token di autorizzazione e aggiornarlo.

Ove possibile, nome utente e password non devono essere memorizzati sul dispositivo . Eseguire invece l'autenticazione iniziale utilizzando il nome utente e la password forniti dall'utente e quindi utilizzare un token di autorizzazione specifico del servizio di breve durata.

L'utilizzo di AccountManger è l'opzione migliore per l'archiviazione delle credenziali. Il SampleSyncAdapter fornisce un esempio di come usarlo.

Se questa non è un'opzione per qualche motivo, è possibile ricorrere alle credenziali persistenti utilizzando il meccanismo Preferences. Altre applicazioni non saranno in grado di accedere alle tue preferenze, quindi le informazioni dell'utente non saranno facilmente esposte.

+36

Direi che è rischioso di mantenere le informazioni sulla password come nelle preferenze. Sui telefoni rooted è possibile accedere al file delle preferenze di un'app. Il minimo che puoi fare è offuscare la password. – Jayesh

+44

Se qualcuno ha il tuo telefono ed è in grado di eseguirne il root, non c'è molto che sarai in grado di fare per mantenere i tuoi dati al sicuro. Non è una cattiva idea quella di offuscare la password, ma in realtà non aggiunge molta più protezione. Ciò che è più importante è che ci sono molti livelli di sicurezza già integrati nel sistema operativo. Certo, non vuoi fare nulla di stupido per eludere queste misure. Probabilmente è meglio usare un sistema come OAuth e memorizzare un token sul dispositivo al posto del nome utente e della password. – elevine

+0

Vedi anche questa domanda [collegamento] (http: // stackoverflow.it/questions/785973/what-is-the-most-appropriate-way-to-store-user-settings-in-android-application) – Diederik

8

È necessario utilizzare l'Android AccountManager. È costruito appositamente per questo scenario. È un po 'ingombrante ma una delle cose che fa è invalidare le credenziali locali se la SIM card cambia, quindi se qualcuno fa scorrere il tuo telefono e getta una nuova SIM, le tue credenziali non saranno compromesse.

Questo fornisce all'utente un modo semplice e veloce per accedere (e potenzialmente eliminare) le credenziali memorizzate per qualsiasi account sul dispositivo, tutto da un'unica posizione.

SampleSyncAdapter (come @Miguel menzionato) è un esempio che utilizza le credenziali dell'account memorizzate.

+2

Dove è documentato che AccountManager "invalida le credenziali locali se la scheda SIM cambia"? – elevine

+0

Non è che ne sia a conoscenza. Tuttavia, è qualcosa che ho iniziato a credere/accettare/comprendere dopo che alcuni utenti della mia app hanno avuto problemi di autenticazione a seguito di scambi di SIM. –

+0

Non lo vedo nel codice JavaDocs o AccountManager. Sembra una buona caratteristica, sarebbe solo bello verificarlo e capire i dettagli. – elevine

7

Penso che il modo migliore per proteggere le credenziali è pensare prima di memorizzare la password con crittografia nel file account.db che non potrebbe essere facilmente disponibile in dispositivi non rooted e in caso di dispositivo rootato che l'hacker deve aver bisogno la chiave per decodificarlo.

Un'altra opzione è fare tutta la tua autenticazione come il modo in cui Gmail sta facendo. dopo la prima autenticazione con il server Gmail. hai il token di autenticazione che verrebbe utilizzato in caso di password. quel token sarebbe archiviato in testo normale. Questo token potrebbe essere falso nel caso in cui si cambi la password da Server.

l'ultima opzione che consiglio di abilitare l'autenticazione a 2 fattori & creare la password specifica del dispositivo per il dispositivo. Dopo aver perso il dispositivo, tutto ciò che serve è disattivare quel dispositivo.

+2

Puoi pubblicare una fonte che dice che accounts.db è crittografato? O dici che la password specifica dovrebbe essere crittografata? –

+0

@Riz, dove archiviare la chiave per la crittografia, quindi ... perché la mia app funziona senza Internet, quindi non posso ottenerla dalla rete – eRaisedToX

2

Con la nuova (Android 6.0) hardware di impronte digitali e API si può fare come in this applicazione di esempio github.

+6

Il progetto di esempio di riferimento crea una chiave nell'archivio chiavi di Android e la usa per creare un codice crittografato la password. La password e il codice cifrato vengono memorizzati come stringhe codificate in base 64 nelle preferenze condivise. Dopo aver eseguito con successo l'autenticazione tramite impronta digitale, la chiave segreta viene recuperata da Android Key Store e utilizzata con il codice decodificato per decrittografare la password decodificata. – mjwheat

+0

@mjwheat questo è così utile per capire cosa sta succedendo nell'esempio. Grazie! Un piccolo refuso: "... per decodificare la password codificata." – muetzenflo

2

Questi sono classificati in ordine di difficoltà per interrompere le informazioni nascoste.

  1. Conservare in chiaro

  2. archivio crittografato utilizzando una chiave simmetrica

  3. Utilizzando la Keystore Android

  4. archivio crittografato utilizzando chiavi asimmetriche

fonte: Where is the best place to store a password in your Android app

Il Keystore stesso è crittografato utilizzando il proprio pin/password lockscreen dell'utente, quindi, quando lo schermo del dispositivo è bloccato, il Keystore non è disponibile. Tienilo a mente se hai un servizio in background che potrebbe aver bisogno di accedere ai tuoi segreti applicativi.

fonte: Simple use the Android Keystore to store passwords and other sensitive information

Problemi correlati