82 votes

Meilleure façon d’assurer l’application Android sensibles données ?

Oui, c’est une question très générale mais j’essaie d’avoir une idée de la meilleure façon de gérer un soft qui touche la base w / un serveur Web qui distribue des données sensibles à l’app. N’importe quel liens, des informations générales, conseils etc... serait appréciée.

Étant donné que l’app stockerait persistant données récupérées de la base de données pour un certain laps de temps... tout devient un peu chatouilleux.

113voto

Felix Points 33944

Stocker des données sensibles sur le périphérique

Cela dépend beaucoup de votre auditoire. Normalement, le système d'exploitation Android interdit aux applications d'accéder à chacun des autres fichiers (c'est à dire les bases de données, les fichiers de préférences, régulièrement les fichiers stockés dans l'application d'annuaire privé) par l'expérience permissions de fichiers sous Linux. Cependant, sur les appareils enracinées une application peut obtenir l'accès root et de tout lire. Quelques choses à penser:

  1. Si vous savez que vos utilisateurs n'auront pas de racine (par exemple, si vous n'êtes pas la distribution de l'application par le biais de l'Android Market, mais seulement dans votre entreprise, ou quelque chose comme ça), vous pouvez simplement compter sur Androïde de système de fichiers basé sur la sécurité.
  2. Si un utilisateur obtient un accès à la racine, il sera très attention à ce que l'application qu'il vous donne l'opportunité de
  3. Si une application ne obtenir un accès root, il peut faire beaucoup de ravages. Les informations contenues dans votre application pourrait être la moins de de l'utilisateur de soucis.
  4. L'enracinement conduit à zéro de la garantie. Y compris dans les applications. Vous ne pouvez pas être tenu responsable pour avoir divulgué des informations sur un téléphone enracinée.

Pour conclure, si votre information n'est pas super-duper sensibles (par exemple, informations de carte de crédit), je vous suggère de simplement s'en tenir à la sécurité par défaut fourni par Android (c'est à dire de tout enregistrer en texte brut, sachant que d'autres applications ne peuvent pas y accéder).

Sinon, le chiffrement est le chemin à parcourir. Il n'est pas sûr à 100% (un hacker de compiler votre application et de comprendre comment décrypter les données), mais c'est une douleur importante à se fissurer et à arrêter la plupart des pirates. Surtout si vous dissimuler votre code avec quelque chose comme ProGuard.


Le transfert de données sensibles à partir du serveur vers l'appareil

Vous avez quelques options ici. Tout d'abord, toujours utiliser le protocole HTTPS. Après avoir activé le HTTPS, voici deux des mesures de sécurité supplémentaires, je propose:

  1. L'utilisation d'une clé API système. Inclure cette clé API dans l'ensemble de vos demandes et de vérifier sur le côté serveur avant d'envoyer une réponse en retour. Rappelez-vous que depuis que vous utilisez le protocole HTTPS, un attaquant ne serait pas en mesure de simplement utiliser un sniffer réseau pour trouver votre clé API. Cependant, c'est assez facile à comprendre si quelqu'un la décompilation de votre application, c'est pourquoi vous pouvez dissimuler encore plus loin (en plus de l'aide de ProGuard). Par exemple, vous pouvez garder la clé API cassé 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, vous venez de concaténer tous ces morceaux. Vous pouvez même appliquer un autre type 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é sera générée à l'aide d'un peu de logique que vous seul connaissez, de sorte que vous pouvez mettre en œuvre le client et côté serveur en tant que bien. Par exemple, une demande peut inclure les paramètres suivants:
    time=1321802432&key=[generated-key]
    generated-key est généré à partir de l' time paramètre. Par exemple: md5(time + salt). Lorsque le serveur reçoit cette requête, il peut faire deux choses:
    1. Vérifiez que key est en effet égal à md5(time + salt) (à noter que seul le client et le serveur connaître le sel et il peut être codé de la même façon à la clé API ci-dessus), et
    2. Vérifiez que time n'est pas trop loin en arrière dans le passé (par exemple, si c'est plus que de 1 à 2 minutes dans le passé, la demande en considération non valide).

La deuxième méthode est plus utile si vous êtes faire de la plaine des requêtes HTTP, où tout le monde peut voir les paramètres en cours d'envoi. Aussi, il est beaucoup plus difficile à comprendre à partir de décompiler le code. Surtout si vous étendez la clé de la logique de calcul entre plusieurs classes.

Toutefois, notez que rien n' est impossible à casser votre application. Vous pouvez dissimuler autant que vous voulez, si un pirate est vraiment déterminé à obtenir vos données, il pourra donc par la décompilation de votre application et de passer de nombreuses nuits blanches à passer à travers votre code et de comprendre comment les demandes sont formées. Le seul réel moyen de sécuriser vos données, en demandant à votre utilisateur un mot de passe, en plus de faire tout le travail que j'ai écrit sur ci-dessus. Vous ne pouvez pas obtenir un mot de passe qui n'existe que dans quelqu'un (l'utilisateur) de la tête de décompiler le code :).

15voto

Joe Plante Points 2733

(Venu ici grâce à une recherche sur Google)

J'ai fait des recherches beaucoup ces derniers temps et cette page a beaucoup grâce à Google et Bing recherches. La largement accepté par la procédure de stockage des données sur le périphérique en toute sécurité a été d'utiliser un algorithme de chiffrement fort comme AES. Plus difficile est de "AES nécessite une clé sécurisée. Que faites-vous avec la clé?"

Google a récemment annoncé un nuage solution de stockage pour les applications, alors vous pourriez envisager de stocker la clé si la situation le permet. Sinon, il semble que l'obtention de la clé à l'extérieur de l'appareil, comme sur un serveur, c'est mieux. Si vous pouvez le faire à l'utilisateur de saisir un code PIN, qui serait en fait le meilleur travail. Vous pouvez faire un mot de passe de dérivation afin de stocker le mot de passe, et vous pouvez refaire le calcul pour vérifier le mot de passe

Sans la "utilisateur de boxe dans un PIN" partie, je n'ai pas trouvé beaucoup de bonnes réponses à cette question. Cependant, NE PAS coder en DUR LA CLÉ SI VOUS DEVEZ STOCKER UNE AVEC L'APP. Au minimum, la génération d'une clé à l'aide d'un générateur de mot de passe sécurisé et/ou une fonction de dérivation comme PBKDF2 (Mot de passe de base de la dérivation de la fonction 2).

Si j'ai lu les messages correctement, Google a fait dire qu'une approche consiste à générer une clé une fois que l'application démarre la première fois, stocker la clé via le MODE_PRIVATE drapeau pour un lot de fichier d'opérations d'e/S, et de l'utiliser comme clé. Vous pouvez également dériver d'autres touches de fonction sur la clé maître, et le NIST en fait suggère quelque chose le long des lignes.

De savoir si ou de ne pas faire confiance au maître de clé de la méthode, je vais vous laisser à vous. Cette clé serait obtenir des exposés sur un dispositif enracinée. Je vais aussi avouer que je suis toujours à la recherche de la question

0voto

Rejinderi Points 3584

Utiliser SSL HTTPS pour le transfert de données au lieu de HTTP, vous devez configurer les certificats sur le serveur pas très sûr de savoir comment il fonctionne..

Si vous êtes vraiment préoccupés par les données, puis de plus amples chiffrer avec un algorithme unique avant de les envoyer et de les décrypter lorsqu'il atteint l'app. Je crois que c'est tout à ce sujet.. Sauf si vous avez besoin de quelque chose de vraiment fort puis de développer votre propre protocole basé sur TCP et/ou utiliser un autre port.. peut-être que ça vous 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/

Comme pour le stockage des données dans l'application que vous pouvez crypter les données avant de les stocker ou vous pouvez utiliser un autre format que SQLite pour une meilleure sécurité que vous pouvez consulter les bases de données sqlite en utilisant le navigateur assez facilement.

À moins que le téléphone est enracinée il ne devrait pas être un moyen d'extraire les données.

0voto

Kuffs Points 12318

Si vous voulez assez bien s’assurer que l’utilisateur ne peut pas voir les données autrement qu’en regardant votre app cryptage est vraiment le seul moyen. Même le stockage « protégé » est accessible à l’utilisateur si un périphérique est enraciné. Même cryptage n’est pas totalement sûr que vous avez besoin déchiffrer les données à un moment donné afin de l’afficher. Vous dissuadera le navigateur occasionnel, mais pas le pirate déterminé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X