web-dev-qa-db-fra.com

Meilleure façon de sécuriser Android Données sensibles à l'application?

Oui, c'est une question assez générale, mais j'essaie de me faire une idée de la meilleure façon de gérer une application qui touche la base avec un serveur Web qui distribue des données sensibles à l'application. Tous liens, informations générales, etc. seraient appréciés.

Étant donné que l'application stockerait des données persistantes récupérées de la base de données pendant un certain temps .. tout devient quelque peu délicat.

67
DJPlayer

Stockage de données sensibles sur l'appareil

Cela dépend beaucoup de votre public. Normalement, le système d'exploitation Android Android interdit aux applications d'accéder aux fichiers les uns des autres (c.-à-d. Bases de données, fichiers de préférences, fichiers réguliers stockés dans le répertoire privé de l'application) via des autorisations de fichiers Linux éprouvées. Cependant, sur les appareils enracinés, une application peut obtenir un accès root et tout lire. Quelques éléments de réflexion:

  1. Si vous savez que vos utilisateurs n'auront pas de racine (par exemple, si vous ne distribuez pas l'application via Android Market, mais uniquement dans votre entreprise, ou quelque chose comme ça), vous pouvez simplement compter sur Android sécurité basée sur le système de fichiers.
  2. Si un utilisateur obtient un accès root, il fera très attention à l'application à laquelle il accorde ce privilège
  3. Si une application obtient un accès root, elle peut faire des ravages. Les informations contenues dans votre application pourraient être le moindre des soucis de l'utilisateur.
  4. L'enracinement ne donne aucune garantie. Y compris dans les applications. Vous ne pouvez pas être tenu responsable de la fuite d'informations sur un téléphone rooté.

Pour conclure, si vos informations ne sont pas extrêmement sensibles (par exemple les informations de carte de crédit), je vous suggère de vous en tenir à la sécurité par défaut fournie par Android (c'est-à-dire tout enregistrer en texte brut, en sachant d'autres applications ne peuvent pas y accéder).

Sinon, le cryptage est la voie à suivre. Ce n'est pas 100% sécurisé (un pirate pourrait décompiler votre application et comprendre comment décrypter les données), mais c'est une douleur majeure à craquer et arrêtera la plupart des pirates. Surtout si vous obscurcissez votre code avec quelque chose comme ProGuard .


Transfert de données sensibles du serveur vers l'appareil

Vous avez ici quelques options. Tout d'abord, utilisez toujours HTTPS. Après avoir activé HTTPS, voici deux mesures de sécurité supplémentaires que je proposerais:

  1. Utilisez un système de clés API. Incluez cette clé API dans toutes vos demandes et vérifiez-la côté serveur avant de renvoyer toute réponse. N'oubliez pas que puisque vous utilisez HTTPS, un attaquant ne pourrait pas simplement utiliser un renifleur de réseau pour trouver votre clé API. Cependant, il est assez facile de déterminer si quelqu'un décompile votre application, c'est pourquoi vous pouvez l'obscurcir encore plus (en plus d'utiliser ProGuard). Par exemple, vous pouvez conserver la clé API divisée en morceaux tout autour de votre code (par exemple, en tant que membres statiques dans deux ou trois classes). Ensuite, lorsque vous envoyez une demande, il vous suffit de concaténer toutes ces pièces. Vous pouvez même appliquer une autre sorte de transformation (par exemple, le décalage de bits) pour le rendre encore plus difficile à comprendre à partir du code décompilé.
  2. Vous pouvez générer une clé à chaque fois que vous envoyez une demande. Cette clé serait générée en utilisant un peu de logique que vous seul connaissez, afin que vous puissiez également l'implémenter côté client et côté serveur. Par exemple, une demande peut inclure les paramètres suivants:
    time=1321802432&key=[generated-key]
    generated-key est généré à partir du paramètre time. Par exemple: md5(time + salt). Lorsque le serveur reçoit cette demande, il peut faire deux choses:
    1. Vérifiez que key est en effet égal à md5(time + salt) (notez que seuls le client et le serveur connaissent le sel et qu'il peut être obscurci de la même manière que la clé API ci-dessus), et
    2. Vérifiez que time n'est pas trop loin dans le passé (par exemple, si cela fait plus de 1 à 2 minutes dans le passé, considérez la demande comme non valide).

La deuxième méthode est plus utile si vous effectuez également des requêtes HTTP simples, où tout le monde peut voir les paramètres envoyés. En outre, il est beaucoup plus difficile de comprendre le code décompilé. Surtout si vous répartissez la logique de calcul clé sur plusieurs classes.

Cependant , notez que rien ne rend impossible le crack de votre application. Vous pouvez masquer autant que vous le souhaitez, si un pirate informatique est vraiment déterminé à accéder à vos données, il le pourra en décompilant votre application et passer de nombreuses nuits blanches à parcourir votre code et à comprendre comment les demandes sont formées. Le seul véritable moyen de sécuriser vos données est de demander à votre utilisateur un mot de passe, en plus de faire tout le travail que j'ai écrit ci-dessus. Vous ne pouvez pas obtenir un mot de passe qui n'existe que dans la tête de quelqu'un (l'utilisateur) à partir du code décompilé :).

99
Felix

(Entré ici grâce à une recherche Google)

J'ai fait beaucoup de recherches sur ces derniers temps et cette page est apparue beaucoup grâce aux recherches Google et Bing. La procédure largement acceptée pour stocker des données sur l'appareil en toute sécurité a été d'utiliser un algorithme de cryptage fort comme AES. La question la plus difficile est "AES nécessite une clé sécurisée. Que faites-vous avec la clé?"

Google a récemment annoncé une solution de stockage basée sur le cloud pour les applications, vous pouvez donc envisager d'y stocker la clé si la situation le permet. Sinon, il semble préférable d'obtenir la clé en dehors de l'appareil, comme sur un serveur. Si vous pouvez obliger l'utilisateur à saisir un code PIN, cela fonctionnera en fait le mieux. Vous pouvez faire la dérivation de mot de passe afin de stocker le mot de passe, et vous pouvez refaire la dérivation pour vérifier le mot de passe

Sans la partie "saisie par l'utilisateur d'un code PIN", je n'ai pas trouvé beaucoup de bonnes réponses à cette question. Cependant, ne codez pas la clé si vous devez en stocker une avec l'application. Générez au minimum une clé en utilisant un générateur de mot de passe sécurisé et/ou une fonction de dérivation comme PBKDF2 (fonction de dérivation basée sur mot de passe 2).

Si j'ai lu les articles correctement, Google a dit qu'une approche consiste à générer une clé une fois que l'application démarre la première fois, à stocker la clé via l'indicateur MODE_PRIVATE dans de nombreuses opérations d'E/S de fichiers et à l'utiliser comme clé. Vous pouvez également dériver d'autres clés sur la base de cette clé principale, et le NIST suggère en fait quelque chose dans ce sens.

Que vous fassiez ou non confiance à la méthode de la clé principale, je vous laisse le soin. Cette clé serait exposée sur un appareil enraciné. J'admettrai également que je fais toujours des recherches sur le problème

12
Joe Plante

Chaque application sur Android s'exécute dans un environnement sandbox sécurisé, de sorte que les autres processus du système ne peuvent pas accéder à votre code ou à vos données privées sans une poignée de main appropriée. Mais il existe encore de nombreuses vulnérabilités en raison d'une mauvaise conception de la Ce lien de Android vous conseille quelques-uns des bons conseils pour la sécurité - https://developer.Android.com/training/articles/security-tips.html

1
Vinayak Bevinakatti

Utilisez SSL sur HTTPS pour transférer des données au lieu de HTTP, vous devez configurer les certificats sur le serveur Web pas très sûr de la façon dont cela fonctionne.

Si vous êtes vraiment préoccupé par les données, chiffrez-les ensuite avec un algorithme unique avant de les envoyer et de les déchiffrer lorsqu'elles atteignent l'application. Je suppose que c'est tout à ce sujet .. Sauf si vous avez besoin de quelque chose de vraiment fort, alors développez votre propre protocole basé sur TCP et/ou utilisez un autre port .. peut-être que cela aidera

http://en.wikipedia.org/wiki/Secure_Sockets_Layer http://developer.Android.com/reference/javax/net/ssl/package-summary.html http://blog.synyx.de/2010/06/Android-and-self-signed-ssl-certificates/

En ce qui concerne le stockage des données dans l'application, vous pouvez crypter les données avant de les stocker ou vous pouvez utiliser un autre format que SQLite pour une meilleure sécurité, car vous pouvez afficher les bases de données sqlite à l'aide du navigateur assez facilement.

À moins que le téléphone ne soit enraciné, il ne devrait pas y avoir de moyen d'en extraire les données.

0
Rejinderi

Si vous voulez vous assurer que l'utilisateur ne peut pas voir les données autrement qu'en regardant votre application, le cryptage est vraiment le seul moyen. Même le stockage "protégé" est accessible à l'utilisateur si un appareil est enraciné. Même le cryptage n'est pas totalement sécurisé car vous devez décrypter les données à un moment donné pour les afficher. Vous dissuaderez le navigateur occasionnel mais pas le pirate déterminé.

0
Kuffs