Pièges liés à l'identification d'un appareil Android


Certains développeurs peuvent avoir besoin d'identifier les appareils Android de leurs utilisateurs. Le plus souvent, cela ne se fait pas pour reconnaître le périphérique, mais pour déterminer l'installation spécifique de l'application. J'ai également rencontré plusieurs cas où c'était nécessaire, si le développeur avait plusieurs applications et voulait comprendre qu'elles fonctionnent dans le même environnement.

Google dit que l' identification d'un appareil est facile. Mais nous parlons d'Android :)

Cet article se concentre sur les applications ou les bibliothèques qui ne souhaitent pas être associées aux services Google.

Plongeons-nous donc dans cette merveilleuse aventure qui consiste à obtenir un identifiant d'appareil unique.

Ici, nous voyons plusieurs façons:


  • Identifiant publicitaire
  • IMEI
  • Adresse MAC
  • Numéro de série
  • ID Android

Ça n'a pas l'air mal pour l'instant, n'est-ce pas? Il existe jusqu'à cinq façons d'obtenir un identifiant unique pour un appareil Android. Je suis sûr que si vous brouillez toujours sur le réseau, vous trouverez sûrement quelques autres façons, mais ici, j'ai fait les plus populaires. Alors allons-y dans l'ordre.

Identifiant publicitaire


Il s'agit d'un identifiant publicitaire unique fourni par les services Google Play. Il est nécessaire que la publicité fonctionne, afin que Google comprenne quelles annonces peuvent être affichées pour un utilisateur spécifique et quelles annonces ont déjà été diffusées à l'aide des bannières publicitaires intégrées aux applications. Et cela signifie également que vous perdrez cet identifiant si votre application est téléchargée, par exemple, sur Amazon, et en plus vous devrez faire glisser les bibliothèques Google dans votre application.

dependencies { compile 'com.android.support:appcompat-v7:21.0.3' compile 'com.google.android.gms:play-services:6.5.87' } 

Conclusion: nous n'identifions pas l'appareil dans tous les cas.

Mais nous voulons à coup sûr, non? Continuez ensuite.

IMEI


Il s'agit de l'identifiant international de l'équipement mobile utilisé sur les téléphones GSM. Le numéro IMEI est utilisé par les réseaux pour identifier les smartphones et bloquer l'accès à un réseau d'appareils volés ou sur liste noire. Mais malheureusement, avec IMEI, un certain nombre de problèmes peuvent survenir:


 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { String imei = telephonyMgr.getImei(); } else { String imei = telephonyMgr.getDeviceId(); } 

Conclusion: nous n'identifions pas l'appareil dans tous les cas, et ils peuvent aussi nous tromper: C

Adresse MAC


Pas fiable à 100%. Google lui-même en parle , mais, malheureusement, j'ai vraiment rencontré quelques applications qui s'appuyaient sur l'adresse MAC de l'appareil. Ne le faites pas.
Il peut être possible de récupérer une adresse Mac à partir du matériel WiFi ou Bluetooth d'un appareil. Nous vous déconseillons de l'utiliser comme identifiant unique. Pour commencer, tous les appareils n'ont pas de WiFi. De plus, si le WiFi n'est pas activé, le matériel peut ne pas signaler l'adresse Mac.

Numéro de série


Il est considéré comme un numéro de série unique de l'appareil, qui reste avec lui jusqu'à la «toute fin». Vous pouvez l'obtenir de cette façon:

 //Until Android 7.1 (SDK 25) Build.SERIAL //Android 8 (SDK 26) ++ Build.getSerial() 

Et maintenant sur les problèmes. Tout d'abord, pour obtenir un numéro de série, vous devrez demander l'autorisation à l'utilisateur READ_PHONE_STATE , et l'utilisateur peut refuser. Deuxièmement, le numéro de série peut être modifié .

Conclusion: nous n'identifions pas l'appareil dans tous les cas, nous devons demander la permission de l'utilisateur, qui le triche et peut encore nous tromper.

ID Android


- Ça y est! - nous devons crier. - La solution à tous nos problèmes!

L'ID Android est également un identifiant d'appareil unique. Il s'agit d'une valeur 64 bits qui est générée et stockée lors du premier démarrage de l'appareil.
Vous pouvez l'obtenir comme ceci:

 Secure.getString(getContentResolver(), Secure.ANDROID_ID); 

Il semblerait qu'une ligne aussi courte nous évite un mal de tête lors de l'identification de l'appareil. Même les gars de Google utilisent Android_ID pour LVL dans l'exemple.

Et ici, nos espoirs s'effondrent et rien ne sera plus pareil. Après la mise à jour vers Android 8, Android_ID est devenu unique pour chaque application installée. Mais, en plus de cela, Google se soucie de nous, donc les applications qui ont été installées avant la mise à jour resteront avec les mêmes identifiants que Google enregistre en utilisant un service spécialement écrit pour cela. Mais si l'application est désinstallée puis réinstallée, Android_ID sera différent. Pour éviter cela, vous devez utiliser KeyValueBackup.


Mais ce service de sauvegarde doit être enregistré, ainsi que le nom du package à spécifier. En outre, la documentation indique que cela peut ne pas fonctionner pour une raison quelconque . Et qui est à blâmer? Personne, juste comme ça.

Conclusion générale


Si vous avez un bon backend, il vous suffit de collecter la distribution de l'appareil (applications installées, services, toutes les données sur l'appareil que vous pouvez obtenir) et de comparer les paramètres déjà là, considérez un pourcentage de modifications acceptables.

PS Je publie toutes les collections comme toujours dans la chaîne de télégramme @paradisecurity , et le lien peut être trouvé dans mon profil, ou trouvé dans la recherche de télégrammes par nom.

Heureux :)

Source: https://habr.com/ru/post/fr434726/


All Articles