Sécurité d'Android SharedPreference

118

Je m'interroge sur la sécurité des préférences partagées.

Est-il possible d'accéder aux préférences partagées, même si elles ont été créées dans MODE_PRIV (0)?
Est-il possible de répertorier toutes les préférences partagées disponibles, puis de récupérer tous les paramètres d'autres applications?
Les préférences partagées sont-elles un bon endroit pour placer des données sensibles, telles qu'un mot de passe ou un jeton d'authentification?

Merci

Marek Sebera
la source
Vaut le détour, avec de belles réponses. Les préférences partagées en disent long sur le style de programmation du développeur.
Vishwa Ratna

Réponses:

232

Les préférences partagées sont stockées sous forme de fichier dans le système de fichiers de l'appareil. Ils sont, par défaut, stockés dans le répertoire de données de l'application avec des autorisations de système de fichiers définies qui permettent uniquement à l'UID avec lequel l'application spécifique s'exécute d'y accéder. Ainsi, ils sont privés dans la mesure où les autorisations de fichiers Linux en limitent l'accès, comme sur n'importe quel système Linux / Unix.

Toute personne disposant d'un accès de niveau racine à l'appareil pourra les voir, car root a accès à tout sur le système de fichiers. En outre, toute application qui s'exécute avec le même UID que l'application de création pourrait y accéder (ce n'est généralement pas fait et vous devez prendre des mesures spécifiques pour que deux applications s'exécutent avec le même UID, donc ce n'est probablement pas un gros préoccupation). Enfin, si quelqu'un pouvait monter le système de fichiers de votre appareil sans utiliser le système d'exploitation Android installé, il pouvait également contourner les autorisations qui restreignent l'accès.

Si vous êtes préoccupé par un tel accès à vos préférences (ou à toute donnée écrite par votre application), vous voudrez le crypter. Si cela vous préoccupe, vous devrez déterminer exactement le niveau de protection nécessaire pour le niveau de risque que vous voyez. Il y a une discussion très approfondie à ce sujet dans Application Security for the Android Platform , qui vient de paraître en décembre 2011 (avertissement: je suis l'auteur de ce livre).

Thamaraiselvam
la source
2
Existe-t-il une documentation officielle qui en parle? Avez-vous des références?
clu
26

Les SharedPreferences ne sont rien d'autre que des fichiers XML dans votre dossier téléphones / data / data /, donc toute application ou utilisateur avec des privilèges de superutilisateur sur un appareil enraciné peut accéder à vos SharedPreferences, même s'ils ont été créés avec MODE_PRIV

Il existe toujours un moyen de le protéger de tout le monde ... Veuillez consulter ce lien. Ici, vous pouvez stocker des données en pref avec cryptage, la classe est explicite et très facile à utiliser.

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

Comme d'autres l'ont dit, tout le monde peut y accéder, mais dans ce cas, personne ne peut lire les données à l'intérieur car elles sont cryptées. Donc , son secure.For Utmost sécurité ma suggestion sera de générer la clé utilisée pour le chiffrement au moment de l' exécution plutôt que difficile coder. Il y a plusieurs façons de faire ça :)

Jazz Haque
la source
8
alors comment enregistrez-vous la clé générée?
Olayinka
3
@Olayinka Il serait plus sûr de crypter cela avec une autre clé et de l'enregistrer dans un fichier SharedPref. Mais alors, que faire de l'autre clé? Sérieusement, le meilleur scénario serait d'envoyer la clé cryptée et un UID de périphérique à un serveur utilisant SSL pour y être stockés et récupérés si nécessaire. Cela nécessiterait une connectivité, mais vous permettrait de mettre sur liste noire un appareil et de mettre toutes les données à la poubelle. Sans connexion Internet constante, toute tentative de chiffrement des données n'est pas sûre à 100%.
Paulo Avelar le
J'ai utilisé la solution ci-dessus ... cela fonctionne 9 fois sur 10 ... mais j'obtiens l'erreur: 1e06b065: Fonctions de chiffrement: EVP_DecryptFinal_ex: BAD_DECRYPT "parfois .. Quelqu'un a-t-il une idée?
Raj Trivedi
3
@PauloAvelar Utilisez Android KeyStore pour le stockage à long terme et la récupération des clés cryptographiques. Les clés ne sont pas stockées dans une application, elles ne peuvent donc pas être compromises. La bibliothèque fournie ne l'utilise pas. Il enregistre le secret dans le code donc il n'est pas sûr.
apex39
13

Normalement, non, elles ne sont pas accessibles par d'autres applications, cependant, vous devez noter que les SharedPreferences sont stockées sous forme de fichiers XML dans le /data/data/répertoire, ce qui signifie essentiellement que toute application avec des privilèges de superutilisateur sur un appareil enraciné peut accéder à vos SharedPreferences, même si elles étaient créé avecMODE_PRIV

aviraldg
la source
3

Est-il possible d'accéder aux préférences partagées, même si elles ont été créées dans MODE_PRIV (0)?

Par n ° de code Mais vous pouvez récupérer le fichier d'application si vous avez des privilèges de super utilisateur.

Est-il possible de répertorier toutes les préférences partagées disponibles, puis de récupérer tous les paramètres d'autres applications?

Si vous êtes un super utilisateur (appareils rootés), vous pouvez extraire tous les fichiers privés de l'application.

Les préférences partagées sont-elles un bon endroit pour placer des données sensibles, telles qu'un mot de passe ou un jeton d'authentification?

Non, il peut être facilement piraté. Si vous souhaitez mettre des données sensibles dans un fichier de préférence partagé, vous pouvez crypter les données et les stocker. Vous pouvez stocker votre clé de chiffrement dans NDK / serveur.

Rajiv Ranjan
la source
Comment peut-il être facilement piraté?
John Sardinha le
Oui le formulaire de question @Jo
Cuong Vo