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.
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:
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 .
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:
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: 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), ettime
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é :).
(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
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
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.
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é.