Comment sécuriser une application Android

introduction

Le système d'exploitation Android possède de nombreuses fonctionnalités de sécurité intégrées, telles que le sandboxing des applications, la protection contre les attaques de tampon et les dépassements d'entiers et les zones de mémoire séparées pour les instructions de programme et les données. Par conséquent, les applications Android simples qui n'exécutent aucun système de fichiers ou opération de réseau peuvent souvent être considérées comme sécurisées par défaut.

Si vous développez une application plus complexe, il vous incombe toutefois de la sécuriser et de protéger la vie privée de vos utilisateurs. Dans cet article, je vais énumérer quelques-unes des meilleures pratiques que vous pouvez suivre pour créer une application Android sécurisée qui ne fuit pas les données ni les autorisations et qui est en général moins vulnérable aux applications malveillantes pouvant être installées sur le système. appareil de l'utilisateur.

1. Utiliser le stockage interne pour les données sensibles

Chaque application Android est associée à un répertoire de stockage interne dont le chemin d'accès est basé sur le nom du package de l'application. Les fichiers de ce répertoire sont très sécurisés car ils utilisent le MODE_PRIVATE mode de création de fichier par défaut. Cela signifie que les fichiers ne sont accessibles à aucune autre application du périphérique. Par conséquent, il est préférable de stocker toutes les données sensibles de votre application dans le répertoire de stockage interne..

Pour déterminer le chemin absolu du répertoire de stockage interne de votre application, il est recommandé d'utiliser le getFilesDir () méthode. Une fois que vous connaissez son chemin, référencer des fichiers à l'intérieur est aussi simple que référencer des fichiers dans un autre répertoire. Par exemple, voici comment vous pouvez référencer un fichier appelé monfichier.dat dans le répertoire de stockage interne de votre application:

Fichier myFile = new File (getFilesDir (), "myfile.dat");

2. Crypter les données sur le stockage externe

La capacité de stockage interne d'un appareil Android est souvent limitée. Par conséquent, il se peut que vous n'ayez parfois pas d'autre choix que de stocker des données sensibles sur un support de stockage externe, tel qu'une carte SD amovible..

Étant donné que les utilisateurs et les autres applications de l'appareil peuvent accéder directement aux données stockées sur le support de stockage externe, il est important de les stocker dans un format crypté. L’un des algorithmes de cryptage les plus utilisés par les développeurs à ce jour est AES, abréviation de Standard d'encryptage avancé, avec une taille de clé de 256 bits.

Écrire du code pour chiffrer et déchiffrer les données de votre application à l'aide du javax.crypto package, qui est inclus dans le SDK Android, peut être source de confusion. Par conséquent, la plupart des développeurs préfèrent utiliser des bibliothèques tierces, telles que la bibliothèque Dissimulation de Facebook, qui sont généralement beaucoup plus faciles à utiliser..

3. Intentions d'utilisation pour IPC

Les programmeurs expérimentés qui débutent dans le développement d'applications Android essaient souvent d'utiliser des sockets, des canaux nommés ou des fichiers partagés pour communiquer de manière asynchrone avec d'autres applications installées sur un périphérique Android. Ces approches sont non seulement dures et peu élégantes, mais également sujettes aux menaces. Une approche plus simple et plus sécurisée de la communication interprocessus sur le système d'exploitation Android consiste à utiliser les intentions..

Pour envoyer des données à un composant spécifique d'une application, vous devez créer une nouvelle instance du Intention classe et utiliser son setComponent () méthode pour spécifier le nom du package de l'application et le nom du composant. Vous pouvez ensuite y ajouter des données en utilisant le putExtra () méthode.

Par exemple, voici comment vous pouvez envoyer la chaîne Bonjour le monde à un Activité appelé Mon activité, qui appartient à une application dont le nom du paquet est mon.autre.app:

// Créer une intention Intention intention = new Intent (); // Spécifiez le nom du composant intent.setComponent (new ComponentName ("my.other.app", "my.other.app.MyActivity")); // Ajouter des données intent.putExtra ("DATA", "Hello World!"); // Envoie l'intention à l'activité startActivity (intent);

Pour envoyer des données à plusieurs applications à la fois, vous pouvez envoyer l’intention sous forme de diffusion à l’aide de la touche sendBroadcast () méthode. Cependant, par défaut, une diffusion peut être lue par n’importe quelle application ayant une configuration appropriée. BroadcastReceiver.

Par conséquent, si vous souhaitez envoyer des informations sensibles sous forme de diffusion, vous devez utiliser une autorisation personnalisée dont Niveau de protection est réglé sur Signature. Ce faisant, le système d'exploitation Android s'assure que seules les applications qui ont été signées à l'aide de votre clé de signature peuvent recevoir la diffusion..

Voici un extrait de code qui vous montre comment envoyer la chaîne. Bonjour le monde en diffusion sécurisée:

// Créer une intention Intention intention = new Intent (); // Ajouter des données intent.putExtra ("DATA", "Hello World"); // Spécifie un nom d'action pour // le filtre d'intention du destinataire intent.setAction ("my.app.receive"); // Envoyer en tant que diffusion en utilisant une permission personnalisée sendBroadcast (intent, "my.custom.permission");

Notez que le code ci-dessus fonctionne comme prévu uniquement si l'autorisation personnalisée est déclarée et utilisée dans les fichiers de manifeste des applications émettrice et réceptrice..

 

4. Utilisez HTTPS

Toutes les communications entre votre application et vos serveurs doivent s'effectuer via une connexion HTTPS, de préférence à l'aide du HttpsURLConnection classe. Si vous pensez que vous pouvez utiliser HTTP pour des données non confidentielles, détrompez-vous..

De nombreux utilisateurs d'Android se connectent tous les jours à plusieurs points d'accès Wi-Fi ouverts situés dans des espaces publics. Certains de ces points chauds pourraient être malveillants. Un hotspot malveillant peut facilement modifier le contenu du trafic HTTP pour que votre application se comporte de manière inattendue ou, pire encore, lui injecter des publicités ou des exploits..

En utilisant HTTPS, tant que le serveur est configuré avec un certificat émis par une autorité de certification de confiance, telle que DigiCert ou GlobalSign, vous pouvez être sûr que votre trafic réseau est sécurisé contre les attaques d'espionnage et d'infiltration..

Si votre application contient beaucoup de code de réseau et que vous craignez d'envoyer involontairement des données en texte clair, vous devez envisager d'utiliser nogotofail, un outil à code source ouvert créé par Google pour rechercher de telles erreurs..

5. Utiliser GCM au lieu de SMS

À l'époque où GCM, abréviation de Google Cloud Messaging, n'existait pas, de nombreux développeurs utilisaient SMS pour transférer les données de leurs serveurs vers leurs applications. Aujourd'hui, cette pratique est en grande partie disparu.

Si vous faites partie de ces développeurs qui n'ont toujours pas basculé de SMS à GCM, vous devez savoir que le protocole SMS n'est ni crypté ni protégé contre les attaques d'usurpation d'identité. De plus, un SMS peut être lu par n’importe quelle application du périphérique de l’utilisateur possédant le READ_SMS autorisation.

GCM est beaucoup plus sécurisé et constitue le moyen préféré pour envoyer des messages à une application, car toutes les communications de GCM sont cryptées. Ils sont authentifiés à l'aide de jetons d'inscription régulièrement actualisés côté client et d'une clé API unique côté serveur. Pour en savoir plus sur GCM, vous pouvez vous référer à ce tutoriel sur les notifications push..

6. Évitez de demander des données personnelles

La vie privée des utilisateurs a beaucoup d'importance ces jours-ci. En fait, certaines lois, telles que la directive de l'Union européenne sur la protection des données et la loi canadienne sur la protection des données personnelles et les documents électroniques, imposent la protection de la vie privée des utilisateurs. Par conséquent, sauf si vous avez une bonne raison et une infrastructure très sécurisée pour collecter, stocker et transmettre des informations personnelles sur les utilisateurs, vous devez éviter de les demander directement dans vos applications..

Une meilleure approche de l'authentification des utilisateurs et des informations sur les profils des utilisateurs sur Android consiste à utiliser la plate-forme Google Identity. Google Identity Platform permet aux utilisateurs de se connecter rapidement à votre application à l'aide de leur compte Google. Après une connexion réussie via la plate-forme, votre application peut facilement rechercher, le cas échéant, divers détails sur l'utilisateur, tels que son nom, son adresse électronique, sa photo de profil, ses contacts, etc. Vous pouvez également utiliser des services gratuits tels que Firebase, qui peuvent gérer l’authentification des utilisateurs pour vous..

Si vous devez gérer vous-même les informations d'identification de l'utilisateur, il est recommandé de les stocker et de les transmettre sous forme de hachages sécurisés. Le moyen le plus simple de générer différents types de hachages à l’aide du SDK Android consiste à utiliser le MessageDigest classe.

Voici un petit extrait de code qui vous montre comment créer un hachage de la chaîne Bonjour le monde en utilisant la fonction de hachage SHA-256:

// Initialisation de MessageDigest pour utiliser SHA-256 MessageDigest md = MessageDigest.getInstance ("SHA-256"); // Convertit la chaîne en octet de hachage [] sha256Hash = md.digest ("Hello World" .getBytes ());

7. Valider la saisie de l'utilisateur

Sur Android, une saisie utilisateur non valide n’entraîne généralement pas de problèmes de sécurité, tels que les dépassements de mémoire tampon. Cependant, si vous autorisez les utilisateurs à interagir avec une base de données SQLite ou un fournisseur de contenu utilisant en interne une base de données SQLite, vous devez soit procéder à une netteté rigoureuse des entrées utilisateur, soit utiliser des requêtes paramétrées. Si vous ne le faites pas, vos données sont vulnérables aux attaques par injection SQL..

Dans le même ordre d'idées, la validation et la désinfection des entrées utilisateur sont également très importantes si vous utilisez ces entrées pour générer de manière dynamique du code à exécuter sur un moteur de script intégré, tel que Mozilla Rhino..

8. Utiliser ProGuard avant de publier

Les mesures de sécurité intégrées à une application Android peuvent être gravement compromises si les attaquants parviennent à mettre la main sur du code source. Avant de publier votre application, il est recommandé d'utiliser un outil appelé ProGuard, inclus dans le SDK Android, pour obscurcir et minimiser le code source..

Android Studio inclut automatiquement ProGuard dans le processus de construction si le buildType est réglé sur Libération. La configuration ProGuard par défaut disponible dans le SDK Android proguard-android.txt Le fichier est suffisant pour la plupart des applications. Si vous souhaitez ajouter des règles personnalisées à la configuration, vous pouvez le faire dans un fichier nommé proguard-rules.pro, qui fait partie de chaque projet Android Studio.

Conclusion

J'espère que vous comprenez mieux maintenant comment sécuriser vos applications Android. La plupart des meilleures pratiques mentionnées dans cet article ne s'appliquent que si vous utilisez le SDK Android pour développer vos applications. Si vous utilisez plutôt le NDK Android, vous devez être beaucoup plus prudent car, lors de la programmation en langage C, vous devez gérer vous-même les détails de bas niveau, tels que les pointeurs et l'allocation de mémoire..

Pour en savoir plus sur la sécurité sur Android, vous pouvez vous reporter aux documents de sécurité AOSP..