Cahier 5 : Terminal Android, Java et Industrie, Mémoire d’un Licence Pro – Partie 2 : Rapport Technique
Remerciements
Je tiens à remercier l’entreprise KARELIS qui m’a accueilli comme stagiaire, ainsi que tout le personnel de l’équipe de Grenoble avec qui j’ai évolué pendant la durée du stage.
Je tiens à remercier également :
- M. Julien PIAT, mon maître de stage pour sa patience et le temps qu’il m’a consacré pour élargir mes connaissances sur le monde du développement.
- M. François ANTOINE, pour ses conseils avisés sur certains problèmes rencontrés.
- M. Jean MENISSIER qui m’a hébergé pendant la durée du stage.
- M. Eric BEISSER & M. Jean-Philippe GALLO les gérants de l’entreprise.
- Toutes autres personnes extérieures à l’entreprise KARELIS qui ont contribué au bon déroulement de mon stage.
Introduction
Sujet
Au cours de mon deuxième et dernier semestre en Licence Professionnelle Systèmes Informatiques et Logiciels spécialité Sécurité Informatique, j’ai été amené à intégrer pour une période de 4 mois le milieu professionnel. Ce stage m’a permis de mettre en pratique les connaissances acquises dans le cadre de cette Licence et d’acquérir une nouvelle expérience professionnelle.
J’ai effectué ce stage au sein de la société Karelis Systèmes et Traçabilité à Veurey-Voroize en Isère (38). L’entreprise étant spécialisée dans la traçabilité industrielle, celle-ci est amenée à développer des applications pour des terminaux industriels ainsi que l’installation et la configuration de points d’accès wifi dans des environnements difficiles (salles blanches, congélateurs industriels…) nécessitant des normes ATEX (ATmosphères EXplosibles) avec un IP (Indice de Protection assez élevé) minimum de 55.
Au cours de mon stage, une comparaison d’un projet Android réalisé par deux technologies différentes m’a été confiée.
Selon les fonctionnalités définies par l’entreprise Karelis. L’application à réaliser devant être sécurisée et servir de support de présentation et d’apprentissage. Une recette devra être réalisée permettant ainsi à l’entreprise Karelis d’utiliser l’IDE « Eclipse » et d’expliquer comment traiter les fonctionnalités demandées en Java natif.
Une conclusion critique et objective sera rédigée en fin de recette sur l’utilisation de la technologie Android dans le monde industriel et de l’investissement ou non de l’entreprise Karelis dans cette technologie.
Dans ce rapport, je commencerai par expliquer de manière globale les mesures de sécurité qui sont mises en œuvre sur le plan humain et matériel puis les mesures de sensibilisation qui ont été prises durant la période de ce stage.
Dans une seconde partie j’exposerai l’activité qui m’a été confiée dans la réalisation de l’application et des procédures de sécurité mises en place pour cette dernière sur le plan matériel et logiciel ainsi que sur le poste serveur.
Puis en dernier lieu je dresserai le bilan du projet qui m’a été confié répondant à la demande de l’entreprise Karelis.
Je conclurai ce rapport en indiquant ce que le stage m’a apporté comme expérience technique et professionnelle.
Encadrant
M. Samy MODELIAR – Tuteur de formation (professeur).
M. Julien PIAT – Tuteur d’entreprise (Responsable développement).
Sécurité globale
Infrastructure réseau
L’entreprise Karelis comporte une infrastructure assez vaste du fait des deux agences et des postes en HOME OFFICE. Nous allons voir de manière plus précise l’infrastructure de l’entreprise (Schéma ci-dessous) :

L’ensemble des équipements de stockage se trouve dans l’enceinte de l’entreprise mère à Grenoble.
L’entreprise dispose de 2 armoires, la première armoire contient les serveurs et la seconde tout ce qui concerne l’infrastructure.
Le site internet de l’entreprise étant hébergé ailleurs pour plus de sûreté en cas de panne sur le réseau Karelis.
Karelis possède trois lignes téléphoniques :
- ADSL pour la connexion internet reliée au FAI NERIM.
- SDSL pour les connexions en VPN entre les 2 agences et les postes en HOME OFFICE.
- Téléphone externe et interne (VoIP)
| L’armoire numéro 1 comporte : • Un onduleur d’une autonomie de ± 30 min • Un NAS contenant les fichiers • Trois Lames avec serveur DHCP, Test et TSE • Un serveur sous UNIX | ![]() |
| L’armoire numéro 2 comporte : • Un routeur (ADSL / SDSL) • Deux switchs PoE administrables • Une DMZ permettant aux clients d’avoir accès à leurs données sans accéder aux données de l’entreprise • Un commutateur IP pour les 3 lignes téléphoniques • Deux onduleurs de ± 30 min, 1 pour la téléphonie, 1 pour l’infrastructure Légende des câbles : En Gris les câbles téléphoniques En Jaune les câbles pour le LAN En Rose les câbles du cœur réseau En Bleu les câbles pour la DMZ et pour l’accès client | ![]() |
En matière de sécurité le serveur ainsi que tous les postes utilisateurs sont équipés d’antivirus. Seul le serveur UNIX ne possède pas d’antivirus.
Les données du NAS de l’agence de Nantes sont dupliquées toutes les nuits sur le NAS de l’agence de Grenoble via la ligne SDSL.
La sécurité des données est assurée sur les NAS par du RAID 1 en quatre exemplaires. Cependant la redondance dégradée n’a pas encore été mise en place.
Sensibilisation
Dès mon deuxième jour de stage, l’ordinateur professionnel qui m’a été attribué a subi une attaque virale importante. Le poste venant juste d’être préparé, celui-ci ne possédait pas encore d’anti-virus.
J’ai été victime d’une I-Bombe apparue récemment sur internet (depuis cette année).
Ce virus une fois exécuté par le système nous informe que la gendarmerie a bloqué notre poste car nous avons été sur des sites à contenu illicite. Pour débloquer l’ordinateur il est nécessaire de payer une certaine somme à la gendarmerie sans garantie de ne pas être bloqué à nouveau.
L’arnaque est facilement identifiable :
- IP présente sur l’interface ne correspond pas à notre IP publique
- La gendarmerie ne demandera jamais un quelconque moyen de paiement
- Le logo des buralistes et de la Française des Jeux jurent avec le logo de la gendarmerie
Nous pouvons voir (photo ci-dessous) que le processus et la stratégie mis en place par les malfaiteurs sont assez ingénieux, bien que maintenant bien connus des informaticiens, des forces de l’ordre et des jeunes.
Cependant, la méthode fonctionne particulièrement bien sur les personnes âgées et les personnes qui débutent avec les nouvelles technologies.

Nous allons voir à présent comment débloquer et supprimer ce malware.
Le problème de ce virus est qu’il s’affiche en plein écran ainsi qu’en écran principal. Il n’existe alors aucun moyen de lancer un exécutable ni même une console DOS.
De plus le virus s’installe comme un programme à lancer au démarrage de Windows, bloquant ainsi le poste.
La première solution alors serait de reformater l’ordinateur et de réinstaller l’OS. Mais cette solution n’est guère plaisante et prend un certain temps.
La seconde solution est d’identifier la menace, de l’isoler, de l’éradiquer puis de faire une analyse virale complète de l’ordinateur.
Pour ce faire, il suffit de redémarrer le PC en mode sans-échec. Puis de lancer l’exécutable msconfig qui permet d’afficher tous les services ainsi que toutes les applications à exécuter au démarrage.
Nous repérons dans la liste des services et des exécutables les noms ou identifiants qui semblent suspects (pas de description ou de nom constructeur) en notant le chemin où se trouve l’exécutable. Puis il suffit de décocher ces derniers pour ne pas qu’ils soient exécutés au démarrage du système.
Nous redémarrons notre poste normalement. Et observons le résultat. Si l’écran s’affiche de nouveau, c’est que nous n’avons pas désactivé le bon exécutable. S’il ne s’affiche pas alors nous devons explorer tous les répertoires relevés lors de la désélection.
Dans notre cas, il se trouve que l’interface est un fichier HTML standard en double-cliquant sur celui-ci nous retrouvons l’interface que nous avions. Nous supprimons alors le répertoire et son contenu de manière définitive, puis nous installons un antivirus.
Après avoir configuré l’antivirus, nous lançons une analyse complète et poussée du poste de développement, nous vérifions l’ensemble des clefs de registre afin de vérifier si le virus a une procédure de redondance.
En conclusion, ce virus qui n’est ni plus ni moins qu’une I-Bombe fait « plus de peur que de mal ». À part bloquer le poste de manière simple (du point de vue de l’informaticien), le système est conçu pour soutirer un maximum d’argent aux victimes, qui paieront le service pour débloquer leur ordinateur sans garantie de ne pas être bloqué de nouveau.
Suite à cet événement, il m’a semblé bon d’informer et de sensibiliser le personnel de l’entreprise Karelis. Chose assez difficile en réalité. Car si certains employés (non techniciens) sont ouverts à toutes explications et conseils sur les mesures de sécurité à mettre en œuvre, d’autres sont plus réticents et restent hermétiques à ces dernières.
Cette péripétie m’aura donc permis de sensibiliser le personnel sur les différentes attaques possibles en insistant lourdement sur le Social Engineering et le lien joint dans le contenu des mails.
Sécurité extérieure
L’entreprise Karelis dispose au niveau de l’infrastructure de ses bâtiments d’une sécurité physique.
L’agence de Grenoble dispose d’un système d’alarme. Si celle-ci vient à se déclencher, un message sera communiqué au gérant M. Jean-Philippe GALLO. La porte de l’entreprise dispose d’un digicode ainsi que d’une serrure.
L’entreprise se trouvant dans une ZAC (Zone d’Activité Commerciale), un agent de sécurité surveille la zone la nuit.
L’agence de Nantes quant à elle se trouve dans un bâtiment abritant plusieurs autres entreprises. La porte d’accès au bâtiment comporte un digicode. L’intégralité du bâtiment est sous alarme.
Projet confié à l’étudiant
Cahier des charges
La première étape du projet qui m’a été confié a été d’établir le cahier des charges en fonction du besoin exprimé par Karelis. Et par la suite concrétiser et matérialiser leur besoin sous la forme d’une application. Puis en dernier lieu d’établir une conclusion objective et critique de l’utilisation de cette technologie pour l’entreprise.
L’objectif étant de réaliser une application pour un terminal industriel sous Android. Cette application devra :
- Communiquer avec une base de données distante via un web service
- Communiquer avec une base de données interne (SQLite)
- Manipuler (Créer, Écrire, Lire) un fichier XML de configuration
- Établir une connexion radio en Bluetooth
- D’imprimer sur une imprimante radio en Bluetooth
- De sécuriser l’application et le serveur
- Récupérer les informations relatives au point d’accès Wifi
- Récupérer le numéro de série du terminal
Après avoir analysé les besoins exprimés par Karelis, chaque fonctionnalité est découpée et organisée en fonction du temps estimé.
Toutes les fonctionnalités sont réalisées puis testées (test unitaire) avant d’être intégrées à l’application.
Sécurité matérielle
La sécurité matérielle sur terminaux industriels Android comporte un véritable problème comparé aux terminaux industriels Windows.
Les terminaux Windows sont faciles à paramétrer pour restreindre l’accès aux paramètres systèmes et aux autres applications. De cette façon l’utilisateur ne peut utiliser que l’application dédiée dans le cadre de son travail et non pas faire autre chose (changer les paramètres, utiliser internet, jouer etc.).
Sous Android, il n’est pas possible de restreindre l’utilisation du terminal à une application unique au démarrage. La touche HOME ne peut pas être condamnée sous Android. Ce qui pose un réel problème.
Ce « défaut » a une grande importance dans la conclusion sur l’usage et l’utilisation d’Android dans l’entreprise.
Sécurité logicielle
Web Service
Sur le serveur, nous utiliserons la dernière version de WAMP Server. L’installation et le paramétrage de ce dernier n’étant pas cruciaux pour l’accessibilité de ce dernier, nous ne nous attarderons pas sur le sujet. Nous verrons seulement comment configurer l’accessibilité à la base de données et la configuration de PHPMyAdmin, puis comment ajouter une règle au pare-feu Windows, et enfin quels sont le comportement et le fonctionnement d’un web-service côté serveur.
Mise en place d’un web service
Le principe d’un web service est d’exécuter des traitements et autres calculs sur le serveur en envoyant à ce dernier une requête ou un/plusieurs paramètre(s).
Information : Un web service ne comporte pas d’interface graphique en temps normal. Cependant, afin de pouvoir effectuer des tests de débogage, une interface graphique existe pour ce web service.
Notre application étant une application lourde, il est intéressant d’effectuer les traitements côté serveur afin de « soulager » le terminal.
Cependant, il est nécessaire d’utiliser des fonctions de sécurité afin d’éviter les attaques classiques telles que l’injection de code malveillant, d’injection SQL.
Le web service qui a été mis en place est construit sur le fonctionnement suivant :
L’application envoie au web service la méthode que l’on souhaite utiliser (avec ou sans paramètre(s))
Le web service regarde si la variable passée en paramètre est null ou non. Pour cela nous utilisons la fonction :
.
Puis dans un second temps, nous allons éviter l’introduction de code malveillant, notamment l’injection SQL qui est l’une des attaques les plus fréquentes sur les serveurs web.
L’injection SQL est une technique où un pirate modifie une requête SQL existante pour afficher des données cachées, ou pour écraser des valeurs importantes, ou encore exécuter des commandes dangereuses sur la base. Cela se fait lorsque l’application prend les données envoyées par l’internaute, et les utilise directement pour construire une requête SQL.
La protection contre les requêtes SQL est effectuée grâce à cette fonction :

Information : La fonction «htmlentities()» est identique à la fonction « htmlspecialchars() », sauf que les caractères qui ont des équivalents en entité HTML sont effectivement traduits.
Une troisième mesure de sécurité est déployée sur chaque requête dans le cas où cette dernière échoue. L’utilisation de la fonction
permet d’afficher (seulement sur le web service) la source de l’erreur en affichant une chaîne de caractères. Le message affiché doit être parlant pour l’administrateur, mais pas suffisamment parlant pour un individu externe afin que celui-ci ne puisse interpréter l’indication comme un indice dans une optique d’attaques malhonnêtes.
Dans le cas de communication entre l’application et notre web Service, le retour des données calculées sur le serveur est encapsulé dans un tableau unique contenant la/les information(s). La réponse retournée se fait par la fonction
.
Paramétrage de PHPMyAdmin
Cette étape est indispensable car le serveur MYSQL ne possède pas de mot de passe pour le compte super-utilisateur : root.
C’est pourquoi, une fois avoir installé WAMP Server sur votre poste de développement ouvrez votre navigateur Web.
Saisissez dans votre barre URL l’adresse locale soit
puis validez. Sur la page chargée, cliquez sur
afin d’être redirigé vers la page de configuration et de gestion des bases de données de notre serveur Web.
Dans la barre de navigation en haut de page, cherchez le lien suivant
et cliquez sur celui-ci.
Vous verrez alors une liste des utilisateurs apparaître. Nous allons modifier les utilisateurs ayant pour nom « root » car ces derniers n’ont pas de mot de passe.

Cochez alors les check box pour tous les utilisateurs identifiés comme root et cliquez sur
. Pour définir un mot de passe. Dans la page qui vient de s’ouvrir, rendez-vous dans la section Modifier un mot de passe. Remplissez le champ mot de passe puis ressaisissez-le pour confirmer ce dernier. Cliquez sur le bouton Exécuter de cette section pour valider les changements.

Réitérez l’opération pour chaque compte root.
Une fois l’opération effectuée, rechargez la page dans votre navigateur. Vous devriez obtenir l’écran suivant :

Ce qui confirme la bonne protection de notre serveur WAMP pour le compte root.
Un problème se pose. Nous avons configuré un mot de passe pour l’utilisateur root, mais nous ne pouvons pas nous connecter. Cela s’explique par le fait que PHPMyAdmin ne connaît pas le mot de passe que nous venons d’attribuer.
Il nous faut alors modifier le fichier config.inc.php se trouvant dans le répertoire
.
Ouvrez ce dernier dans un éditeur de texte.
Dans la section /*Server : localhost [1] */ commentez les lignes (// pour commenter en php)
et
.
Puis ajoutez à la suite des deux lignes commentées les lignes suivantes :
| Vous devriez avoir la section suivante (image ci-contre) : La méthode de connexion au service PHPMyAdmin se fera désormais à travers une boîte de dialogue en demandant à l’utilisateur de saisir son login et password. ![]() Enregistrez le fichier que nous venons de modifier et redémarrez les services. | ![]() |
Nous venons donc de sécuriser notre serveur web. Nous allons voir maintenant comment configurer celui-ci pour qu’il puisse être accessible depuis un poste externe.
Dans un premier temps, il va falloir passer le serveur web (WAMP) en ligne. Pour cela, allez dans la barre des tâches de Windows chercher l’icône
dans la zone de notification (il se peut que l’icône soit
ou
si le serveur n’est pas démarré, si c’est le cas démarrer le serveur).
Faites un clic gauche sur l’icône, puis un clic sur
afin de rendre le serveur en ligne.
Dans un second temps, il est nécessaire de modifier le fichier phpmyadmin.conf contenu dans le répertoire
. Les modifications que nous allons apporter vont permettre d’autoriser les connexions à notre serveur depuis un poste externe.
Pour cela, nous allons autoriser la connexion de n’importe quel appareil.
Supprimez les lignes « Deny from all » et « Allow from 127.0.0.1 » pour les remplacer par la ligne « Allow from all ».
Changez la ligne « Order Deny,Allow » en « Order Allow,Deny ».
Vous devriez avoir le contenu suivant :
| Fichier phpmyadmin.conf (non modifié) | Fichier phpmyadmin.conf (modifié) |
![]() | ![]() |
Une fois l’opération de modification effectuée, redémarrez les services.
Nous venons ainsi de rendre le serveur accessible depuis l’extérieur. Cependant, pour pouvoir avoir accès au service PHPMyAdmin, il sera nécessaire de s’identifier (d’où l’importance d’avoir mis un mot de passe sur l’utilisateur root).
Information : Pour tester la connexion depuis un poste externe et/ou un terminal, ouvrez un navigateur web, puis saisissez l’url suivante :
http://adresse_ip_serveurWeb/phpmyadmin
(En remplaçant l’adresse_ip_serveurWeb par l’adresse de votre serveur)
Une fenêtre de dialogue vous demandera comme précédemment de vous identifier pour avoir accès au service.
Pour parfaire la sécurité touchant notre serveur web, nous allons créer un utilisateur qui puisse seulement manipuler et interroger une base de données spécifique parmi toutes celles présentes sur notre serveur.
Dans l’interface de PHPMyAdmin, cliquez sur le bouton
. Une nouvelle vue s’affiche. Cliquez alors sur le lien
. Une fenêtre s’ouvre en premier plan. Renseignez les champs.
| Pour le nom de l’utilisateur, choisissez le nom que vous souhaitez mettre. Dans la section client, définissez l’adresse ou une plage d’adresses pour laquelle l’utilisateur sera autorisé à se connecter. Saisissez un mot de passe pour ce compte utilisateur. Dans la section qui suit, définissez les droits sur la/les base(s) de données. Comme nous créons le compte de manière globale, nous ne choisissons aucune base pour cet utilisateur pour l’instant. La section suivante permet d’ajouter des droits. Nous ne cochons aucune case. Puis cliquez sur le bouton Exécuter pour créer cet utilisateur. | ![]() ![]() |
Ainsi, nous venons de créer un utilisateur en contraignant ses actions au niveau global (image ci-dessous).

Maintenant, nous allons autoriser et donner les droits à cet utilisateur « User » d’utiliser la base usagiAka. Cliquez sur Changer les privilèges de la ligne que nous avons créée (image ci-dessus). Puis recherchez la section suivante :

Dans la liste déroulante
sélectionnez la base de données « usagiAka ». Puis cliquez sur le bouton
de cette section.
Attention : Ne donnez et sélectionnez aucun droit avant d’avoir sélectionné le nom de la BDD et d’avoir confirmé le changement en ayant appuyé sur le bouton Exécuter. Sans quoi vous ne donnez pas les droits d’utilisation sur la base, mais les droits globaux !
Après avoir appuyé sur Exécuter vous vous retrouvez sur l’écran suivant (ci-dessous) cochez les cases permettant d’attribuer les droits sur la base usagiAka. Dans mon cas, j’ai choisi de lui donner tous les droits cochés ci-dessous.

Une fois terminé, cliquez sur le bouton
de cette section.
Nous allons vérifier que notre utilisateur créé ci-dessus a bien les droits sur la BDD sélectionnée. Pour cela cliquez sur
dans la colonne gauche de l’interface. Puis sur le bouton
dans la barre d’outils de la vue principale.
Nous retrouvons l’utilisateur que nous avons créé ainsi qu’un récapitulatif des droits sur la base et des privilèges dont celui-ci jouit sur le serveur web.

En conclusion, notre serveur ainsi que notre base de données sont bien sécurisés. Cependant, il sera nécessaire de vérifier le fichier de log pour contrôler les connexions et maintenir un niveau de sécurité suffisant et réadapter les règles de sécurité déployées jusqu’à présent.
Firewall
Notre serveur web qui hébergera notre futur Web Service étant distant, il est nécessaire de configurer le firewall. Notre futur web service sera établi sur le langage PHP/SQL. Donc, nous devrons ouvrir le port utilisé par MySql pour envoyer une requête et récupérer le résultat de cette dernière.
Le serveur utilisant Windows comme système d’exploitation, nous allons voir comment ajouter une règle.
Rendez-vous dans le Panneau de Configuration et sélectionnez Pare-feu Windows.
Une fois dans l’onglet du Pare-feu, sélectionnez Paramètres avancés dans la colonne gauche de la fenêtre.

Dans la fenêtre qui vient de s’ouvrir, nous pouvons distinguer 3 zones. La zone principale, listant toutes les règles qui sont appliquées, une zone d’action et une zone permettant de choisir la nature de la règle que nous souhaitons appliquer.

Une fenêtre de procédure pour la création d’une nouvelle règle s’affiche à l’écran. La procédure se déroule en 5 temps, la définition du type de règle, les paramètres du protocole utilisé, les actions que va autoriser cette règle, le profil de cette règle et le nom de cette règle avec un descriptif de cette dernière.
| Nous choisissons le type de règle. Dans notre cas, MySql utilise le port 3306. Donc, nous sélectionnons une règle de type Port. Cliquez sur Suivant pour passer à l’étape suivante. | ![]() |
| Dans cette seconde étape, nous choisissons une règle basée sur le protocole TCP (car nous sommes en mode connecté). Nous précisons le port à ouvrir. Soit pour MySql 3306. Cliquez sur Suivant pour passer à la troisième étape de la procédure. | ![]() |
| Dans cette phase, il faut choisir le type de connexion. Devons-nous autoriser la connexion, la bloquer ou l’autoriser si elle est sécurisée ? Dans notre cas, nous utiliserons la première proposition soit une simple autorisation. Cliquez sur Suivant pour passer à la prochaîne étape de la procédure. | ![]() |
| Dans l’étape de profil, nous pouvons choisir pour quel type de réseau nous souhaitons appliquer cette règle. Pour notre application, nous choisissons de rendre opérationnelle cette règle pour les réseaux de type Domaine et Privé. Et non Public. Cliquez sur Suivant pour passer à la dernière étape de la procédure. | ![]() |
| La dernière étape de la procédure de création de règle permet de nommer cette dernière et de décrire sa fonction. Cliquez sur Terminer pour finaliser la création de la règle WAMP-MySql. | ![]() |
Ainsi, nous venons de créer notre règle pour notre Firewall. Cependant, celle-ci peut être optimisée afin d’augmenter la sécurité lors de l’accès à notre Web Service.
| Cherchez dans la liste des règles de trafic entrant la règle que nous venons de créer et sélectionnez-la. Dans la colonne de droite vous devez retrouver la liste ci-contre. Sélectionnez l’élément Propriétés qui nous permettra d’ajouter des contraintes supplémentaires sur la liste que nous avons créée. | ![]() |
Une fenêtre avec plusieurs onglets s’ouvre. Sélectionnez l’onglet Étendu puis dans l’encadré intitulé Adresse IP locale, changez l’état du bouton radio de N’importe quelle adresse IP à Ces adresses IP. Puis cliquez sur Ajouter.
![]() | Une nouvelle fenêtre de dialogue apparaît et il ne reste alors qu’à choisir si nous souhaitons ajouter une adresse IP particulière, ou un sous-réseau. Il est également possible de définir une plage d’adresses. Puis il suffit de confirmer en cliquant sur OK. |
![]() | Ci-contre, le rendu de la fenêtre de dialogue après avoir configuré l’onglet étendu. Il ne reste alors qu’à valider cette fenêtre en cliquant sur le bouton OK pour appliquer les paramètres avancés à notre règle WAMP-MySql. |
Application
La base d’une application Android est la sûreté de celle-ci. Android étant basé sur le système d’exploitation UNIX. Il est nécessaire de déclarer des permissions dès que nous souhaitons utiliser des ressources matérielles. Bien au-delà de ce détail, par défaut chaque appareil que ce soit un Smartphone, une tablette grand public ou industrielle, l’utilisateur n’est pas rooté par mesure de sécurité.
Dans notre cas, c’est un handicap majeur. Car en tant que développeur, nous n’avons pas accès au contenu de certains répertoires qui sont accessibles seulement en tant que super-utilisateur.
Dans le cadre du stage il est important de limiter l’accès aux fonctionnalités et à la navigation des applications présentes sur le terminal. Chose impossible sur Android car il est impossible de condamner ni même d’intercepter le signal du bouton
qui met en veille l’application au cours d’exécution et ramène l’utilisateur sur l’écran d’accueil.
De plus le cycle de vie d’une application sous Android est assez délicat.
| Comme nous pouvons le voir d’après l’organigramme ci-contre, il existe plusieurs états dans lesquels peut évoluer une application lancée. Les applications étant stockées dans une pile d’activité, Android gère cette dernière comme une pile LIFO. Suivant les ressources demandées par le système, une application qui a été mise en pause peut se voir tuée si le terminal a besoin de ressource mémoire supplémentaire. Ce qui peut être délicat dans le cas d’un inventaire ou d’une saisie. De cette façon, il est indispensable d’assurer le bon développement du code afin d’éviter les fuites mémoire. | ![]() |
Base de données
Dans la mise en œuvre des fonctionnalités liées à la base de données, il a été nécessaire d’inventer un thème pour l’application. Et donc une base de données.
Ci-dessous nous pouvons voir le MCD (Modèle Conceptuel de Données) de notre base de données :

Naturellement dans notre base de données il y a un champ dont les données nécessitent d’être sécurisées. Dans la table technicien les données du champ PASSWORD ne peuvent pas apparaître en clair dans la base de données. Pour cela, nous allons crypter les mots de passe via l’algorithme de hachage SHA1.
De plus aucune suppression ne doit être faite dans notre base de données afin de garder une trace des données même si elles ne sont plus utilisées. Pour cela dans les tables le champ ETAT a été rajouté de manière à définir si la valeur est valide ou non. Il aurait été logique de déclarer le contenu de ce champ en tant que valeur booléenne, mais afin d’anticiper un statut supplémentaire par la suite, le champ a été déclaré en tant que entier (32 bits).
Gestion des erreurs et des exceptions
Comme vu précédemment, il est indispensable de gérer les fuites mémoire ainsi que les exceptions en cas d’erreurs dans notre application. Dans certains cas de figure, une erreur non traitée peut provoquer un dysfonctionnement de l’application et forcer le système à tuer notre application.

Par exemple ci-dessus, nous avons la fenêtre d’erreur retournée par Android lorsqu’une application échoue. Dans notre cas, c’est une erreur non attrapée lors de la connexion à un appareil Bluetooth qui entraîne l’extinction de notre application.
Dans l’optique où nous pouvons sécuriser la navigation dans un terminal, l’utilisateur qui arrive à générer une erreur mettant fin au processus de notre application se retrouve alors redirigé vers le menu du système Android.
Il est donc primordial lors d’appel ou d’exécution de méthode à risque d’isoler cette dernière dans un Thread séparé du Thread principal de notre application ou de mettre en place une structure try/catch qui retournera une erreur en cas d’échec d’exécution de notre méthode. Il est tout à fait possible de générer nos propres Exceptions en faisant hériter ces dernières de la classe Exception.
Ensuite lors de la déclaration de notre méthode nous allons ajouter la condition throws suivie de notre Exception. De cette façon, si la méthode échoue l’application va basculer immédiatement dans notre Exception et traiter cette erreur sans tuer notre application.
| Try/Catch | Throws Exception |
![]() | ![]() |
Droit d’accès et d’utilisation
Notre application comporte une sécurité lors de son exécution. Afin d’avoir accès à l’écran de sélection du type d’opération (image N°1), il est nécessaire de s’identifier via l’écran principal (image N°2).
| Image N°1 | Image N°2 |
![]() | ![]() |
Sans la saisie du login et du mot de passe il est impossible d’avoir accès à l’écran suivant. Techniquement, nous récupérons la valeur de ces deux champs, puis nous construisons notre requête à destination de notre serveur.

Nous récupérons en résultat le nom du technicien dans la table ainsi que son mot de passe crypté.
Puis dans un second temps, nous allons comparer le mot de passe retourné avec la valeur saisie que nous allons crypter avec la méthode hashageSHA1() qui prend en paramètre la chaîne de caractères à crypter.
| Dans un premier temps, nous allons instancier un objet md de la classe MessageDigest en spécifiant l’algorithme de cryptage utilisé soit : MessageDigest.getInstance(SHA1). Puis nous allons définir le mot que nous souhaitons crypter avec le codage de caractère de celui-ci. Nous mettons le résultat du hachage de notre mot dans un tableau de byte. Il sera nécessaire de regarder la taille de chaque case de ce tableau afin de rajouter les 0 supprimés lors de l’initialisation du tableau raw[]. | ![]() |
Dans le cas où la taille de la cellule de notre tableau est égale à 1, nous allons ajouter le caractère 0 devant la valeur contenue.
De manière plus précise, lors du hachage de notre mot si nous obtenons le byte 08, lors de l’écriture de cette donnée dans notre tableau de byte le système va écrire dans la cellule définie le caractère 8 et non 08 (afin de ne pas consommer de la mémoire inutilement). Or lorsque nous reconstituons la chaîne de caractères que nous venons de crypter la taille de notre chaîne est dans la majorité des cas inférieure à 40 caractères. Or la spécification de l’algorithme de cryptage SHA1 est de donner en sortie la donnée cryptée sous 40 caractères.
Voilà pourquoi nous devons rajouter un 0 devant les valeurs des cellules ayant une taille de 1 caractère.

Il ne reste alors qu’à comparer la valeur retournée par la requête avec les valeurs saisies par l’utilisateur. Si les valeurs sont identiques alors nous sommes autorisés à accéder à l’écran de sélection de la tâche que nous souhaitons effectuer (Image N°1).
Il existe aussi une couche d’identification lorsque l’utilisateur souhaite modifier les paramètres systèmes de connexion à la base de données, Bluetooth ou pour quitter l’application. Dans le secteur industriel, les techniciens ne sont pas forcément habilités à avoir accès aux interfaces de configuration de l’application. Ainsi, si l’utilisateur appuie sur le bouton
il aura le choix de choisir quelle action il souhaite exécuter :

L’action sur l’un de ces champs entraînera automatiquement l’ouverture d’une boîte de dialogue demandant alors à l’utilisateur de saisir le mot de passe système du terminal.
Par défaut l’application ne possède pas de mot de passe.
Cependant, le mot de passe apparaît non crypté dans le fichier de configuration. Ce qui pose un problème réel quant à la sûreté de notre application.

(Boîte de dialogue régissant l’accès aux interfaces de configuration)
Dans le cas où un technicien viendrait à changer le mot de passe système alors qu’il n’en a pas l’habilité ou que celui-ci vienne à l’oublier, il existe un mot de passe écrit dans le code de notre application permettant de réaliser un backdoor.
![]() | En règle générale, l’utilisation de ce moyen est mal vue et peut être considéré comme une brèche de sécurité. Cependant dans le monde industriel c’est un moyen d’intervention rapide et efficace en cas de problème, panne… Dans notre cas le mot de passe qui permet d’avoir accès à toutes les interfaces est : 17935 |
Conclusion
Le projet qui m’a été confié est fonctionnel dans sa totalité. Naturellement, le code reste à optimiser et à déboguer en profondeur.
Le tableau ci-dessous fait le bilan des fonctionnalités demandées par Karelis lors de l’expression de leur besoin :
| Type | Fonctionnalités | État |
|---|---|---|
| Fichier de configuration | Écriture (XML) | VALIDE |
| Lecture (XML) | VALIDE | |
| Base de données (MySQL) | Requête via http à un web service | VALIDE |
| Requête directement à une BDD (JDBC) | VALIDE | |
| Base de données (SQLite) | Créer une base de données .db | VALIDE |
| Effectuer des requêtes (INSERT/UPDATE/SELECT) | VALIDE | |
| Synchroniser les données avec BDD MySQL | VALIDE | |
| Systèmes | Récupération SSID et @MAC point d’accès | VALIDE |
| Récupération N° de série de l’appareil | VALIDE | |
| Récupération de @IP délivré par le point d’accès | VALIDE | |
| Bluetooth | Récupérer les appareils associés | VALIDE |
| Récupérer les appareils disponibles | VALIDE | |
| Activer/Désactiver la carte Bluetooth | VALIDE | |
| Imprimer des données envoyées | VALIDE | |
| Établir une connexion | VALIDE | |
| Bluetooth existence sur l’équipement | VALIDE |
L’application Android qui a servi à utiliser toutes ces fonctionnalités n’est cependant pas optionnelle. Ce qui ne pose pas de réel problème sauf de pouvoir observer l’ergonomie, la fluidité qu’offre Android. Bien que l’application soit encore en cours de développement, nous pouvons nous rendre compte de la différence de dynamisme entre un programme développé sous WinDEV pour Windows Mobile/CE et un programme développé en java natif pour Android.
Pour réaliser une application Android, même si WinDEV permet de créer des projets pour ce type de plateforme, il est préférable d’utiliser une application en java native. Il existe de nombreux problèmes comportementaux d’un projet WinDEV sous Android au niveau de la durée de vie d’une application.
Bilan
Au cours de ce stage en entreprise, le projet qui m’a été confié m’a permis de prendre conscience de l’importance de la sécurité d’un programme dans le secteur industriel. Il en a été de même avec la sensibilisation de la sécurité informatique au sein de la société.
Sur l’aspect « prévention » des risques liés à une attaque informatique, j’ai pris conscience que ce qui pouvait être évident comme règle de sécurité ne l’était pas forcément chez les employés. Ce qui vient mettre en avant la qualité de la formation qui nous a été dispensée au cours de ces 6 premiers mois. Au sein d’une entreprise, le maillon le plus faible reste l’humain et c’est à ce niveau qu’il est nécessaire d’intervenir régulièrement.
Mon seul regret sera de ne pas avoir terminé l’application développée au cours du temps imparti défini par la durée du stage.
À défaut d’avoir rendu une application fonctionnelle en tous voulu, la recette décrivant la procédure d’installation et l’utilisation d’Android a été réalisée, ainsi qu’une description des méthodes mettant en œuvre les besoins exprimés dans le cahier des charges. La société Karelis a maintenant un support de référence grâce à cette documentation permettant en cas d’investissement dans cette technologie d’utiliser mes travaux afin de gagner du temps et de se lancer dans le développement industriel Android.
Ce rapport est accessible comme document annexe. Cette annexe comporte des explications plus approfondies sur le point de vue technique. Je vous invite à prendre connaissance de cette dernière en cas de questions plus techniques.
Le stage m’a aussi appris le fonctionnement, et l’intérêt de la mise en place d’un web service et de sa sécurisation. De plus, lors de la conception de l’application client, la notion de sécurité a toujours été un sujet récurrent. Il demande une remise en question personnelle et continuelle afin de combler les failles et toutes les erreurs qui n’ont pas été définies lors de la phase d’analyse.
Cette dernière expérience professionnelle dans le monde du travail vient confirmer mon goût pour l’informatique et encore plus pour la sécurité informatique. Pendant la durée du stage, j’ai pu apprendre d’une manière différente des enseignements, et ainsi consolider mes connaissances en informatique.























