2012-02-11 16 views
83

Mi chiedo sulla sicurezza delle preferenze condivise.Sicurezza SharedPreference Android

È possibile accedere a sharedpreferences, anche se sono stati creati in MODE_PRIV (0)?
È possibile elencare tutte le sharedpreferences disponibili e quindi recuperare tutte le impostazioni da altre app?
È sharedpreferences un buon posto per inserire dati sensibili, come password o token di autenticazione?

Grazie

+0

possibile duplicato di [Quanto sono sicuri i file SQLite e SharedPreferences su Android?] (Http://stackoverflow.com/questions/3608883/how-secure-are-sqlite-and- sharedpreferences-files-on-android) –

risposta

185

Preferenze condivise sono STO rosso come file nel filesystem sul dispositivo. Sono, per impostazione predefinita, memorizzati all'interno della directory dei dati dell'app con le premesse del filesystem che consentono solo l'UID con cui viene eseguita l'applicazione specifica per accedervi. Quindi, sono privati ​​in quanto le autorizzazioni dei file Linux limitano l'accesso a loro, come su qualsiasi sistema Linux/Unix.

Chiunque abbia accesso al dispositivo a livello di root sarà in grado di vederli, dato che la root ha accesso a qualsiasi cosa sul filesystem. Inoltre, qualsiasi applicazione che viene eseguita con lo stesso UID dell'applicazione di creazione sarebbe in grado di accedervi (di solito non viene eseguita e è necessario intraprendere azioni specifiche per far funzionare due app con lo stesso UID, quindi probabilmente non è una grande preoccupazione). Infine, se qualcuno è stato in grado di montare il filesystem del dispositivo senza utilizzare il sistema operativo Android installato, potrebbe anche ignorare le autorizzazioni che limitano l'accesso.

Se sei preoccupato per tale accesso alle tue preferenze (o ai dati scritti dalla tua applicazione), allora dovrai crittografarlo. Se sei preoccupato per loro, avrai bisogno di capire esattamente quanta protezione è necessaria per il livello di rischio che vedi. C'è una discussione molto ampia su questo argomento nel Application Security for the Android Platform, appena pubblicata nel dicembre 2011 (dichiarazione di non responsabilità: sono l'autore di questo libro).

+2

+1 Questa è un'ottima risposta: concisa e informativa. Grazie! –

+2

C'è qualche documentazione ufficiale che parla di questo? Hai qualche referenza? – clu

10

Normalmente, no, non è possibile accedere da altre applicazioni, tuttavia, si dovrebbe notare che SharedPreferences sono archiviati come file XML nella directory /data/data/, il che significa in sostanza che qualsiasi applicazione con privilegi di superutente su un dispositivo radicatapuò accesso tuoi SharedPreference s, anche se sono stati creati con MODE_PRIV

19

SharedPreferences non sono altro che file XML nel vostro telefono/dati/data/cartella, quindi qualsiasi applicazione o utente con i privilegi di superuser su un dispositivo radicata possono accedere ai SharedPreferences, anche se sono stati creati con MODE_PRIV

Ancora c'è un modo per proteggerlo da parte di tutti ... Si prega di controllare questo link. Qui puoi memorizzare i dati in pref con crittografia, la classe è autoesplicativa e molto facile da usare.

https://github.com/sveinungkb/encrypted-userprefs

Come detto da altri chiunque può accedervi ma in questo caso non si può leggere dati all'interno come è criptato. Quindi è sicuro. Per la sicurezza massima il mio suggerimento sarà quello di generare la chiave utilizzata per la crittografia in fase di esecuzione piuttosto che codificarla. Ci sono molti modi per farlo :)

+3

quindi come si salva la chiave generata? – Olayinka

+1

@Olayinka Sarebbe più sicuro crittografarlo con un'altra chiave e salvarlo in un 'SharedPref'. Ma poi, cosa fare con l'altra chiave? Seriamente, lo scenario migliore sarebbe quello di inviare la chiave crittografata e un UID del dispositivo a un server utilizzando SSL per essere memorizzati lì e recuperati in base alle esigenze. Ciò richiederebbe la connettività, ma ti consentirebbe di inserire nella blacklist un dispositivo e improvvisamente tutti i dati verranno eliminati. Senza una connessione Internet costante, qualsiasi tentativo di crittografare i dati non è sicuro al 100%. –

+0

Ho usato la soluzione di cui sopra ... funziona 9 volte su 10..ma sto ricevendo errore: 1e06b065: Funzioni di cifratura: EVP_DecryptFinal_ex: BAD_DECRYPT "a volte .. Qualcuno ha un'idea? –

Problemi correlati