web-dev-qa-db-fra.com

Moyen fiable de générer un identifiant matériel unique

Question: Je dois créer un identifiant unique pour chaque client en réseau, tel que:

  • il (ID) devrait persister une fois le logiciel client installé sur l'ordinateur cible, et devrait persister si le logiciel est réinstallé sur le même ordinateur et le même épisode de système d'exploitation,
  • cela ne devrait pas changer si la configuration matérielle est modifiée de la plupart des façons (sauf changer la carte mère)
  • Lorsqu'un disque dur avec le logiciel client installé est cloné sur un autre ordinateur avec une configuration matérielle identique (ou aussi similaire que possible), le logiciel client doit être informé de cette modification.

Un peu d'explication et un peu d'histoire:

Cette question est fondamentalement ancienne et concerne également la protection contre la copie de logiciel, car certains des mécanismes utilisés dans ce domaine sont mentionnés ici. Je devrais préciser à ce stade que je ne cherche pas de système de protection contre la copie. S'il vous plaît, lisez la suite. :) 

Je travaille sur un logiciel client-serveur censé fonctionner sur un réseau local. Un des problèmes que je dois résoudre est d’identifier chaque client unique du réseau (ce n’est pas vraiment un problème), afin que je puisse appliquer certains attributs à chaque client spécifique, les conserver et les appliquer pendant la durée de déploiement d’un programme spécifique. client.

Alors que je cherchais une solution, je savais ce qui suit:

  • Le système d’activation Windows utilise un mécanisme d’empreinte digitale très sensible aux modifications du matériel,
  • Le logiciel de création d’image de disque copie tous les ID de volume (liés à chaque partition lorsqu’ils sont formatés), ainsi que des identifiants personnalisés générés de manière unique au cours du processus d’installation, de la première utilisation ou de toute autre manière strictement logicielle, stockée dans un registre sur le disque dur, il est donc très facile de confondre deux.

Le choix évident pour ce genre de problème serait de trouver les identifiants du BIOS (pas tout à fait sûr si c'est unique avec des modèles de cartes mères identiques), car c'est la seule chose sur laquelle je peux compter qui ne soit pas dupliquée, transférée par clonage. , et cela ne peut pas être changé (du moins pas en utilisant un programme utilisateur). Tout le reste échoue soit comme n'étant pas fiable (clonage MAC, n'importe qui?), Soit trop exigeant (trop sensible aux changements de configuration).

La sous-question que j'aimerais poser est la suivante: est-ce que je le fais correctement sur le plan de l'architecture? Peut-être y at-il un meilleur outil pour la tâche que je dois accomplir ...

Une autre approche à laquelle je pensais correspond à un mécanisme de négociation, dans lequel un serveur conserve une table de recherche interne des identifiants de clients connectés (qui peut même être entièrement basée sur un logiciel et non unique à tout moment), et dire au client de indiquez un identifiant différent lors de la négociation, si un duplicata est fourni lors de la connexion. Malheureusement, cette approche ne correspond pas à l’une des conditions requises pour lier des attributs à un client spécifique tout au long de la vie.

25
mr.b

Il me semble que vous devriez créer l'identifiant unique correspondant à vos besoins. Cet ID peut être construit sous la forme d'un hash (comme MD5, SHA1 ou SHA512) à partir des informations importantes pour vous (quelques informations sur les composants logiciels et matériels).

Vous pouvez sécuriser davantage votre solution si vous signez ce hachage avec votre clé privée et que votre logiciel vérifie au démarrage que la clé ( hash value ) est signée (seule la clé publique doit être installée avec votre logiciel). . On peut développer ce type de solution avec différents services en ligne, mais les entreprises clientes pourraient trouver des services en ligne pas si gentils.

7
Oleg

Ce que vous cherchez, c'est le Windows WMI . Vous pouvez obtenir l'ID de la carte mère (qui est unique sur le même type de carte mère) ou de nombreux autres types d'identificateurs uniques et proposer une fonction géniale intelligente permettant de générer un UHID. Whoa ai-je juste inventé un acronyme?

Et si vous cherchez spécifiquement à obtenir l'ID de la carte mère (BIOS):

WMI class: Win32_BIOS
Namespace: \Root\Cimv2

Documentation: http://msdn.Microsoft.com/en-us/library/aa394077(VS.85).aspx
Exemple de code: http://msdn.Microsoft.com/en-us/library/aa390423%28VS.85%29.aspx

Edit : Vous n'avez pas spécifié de langage (et j'ai supposé le C++), mais cela peut être fait en Java (avec un pilote COM), ainsi que dans n'importe quel langage .NET.

7
David Titarenco

De nombreux programmes utilisent hostId pour créer un code de licence (comme ceux basés sur FlexLM). Regardez ce que fait Matlab en fonction du système d'exploitation:

http://www.mathworks.com/support/solutions/fr/data/1-171PI/index.html

Regardez aussi cette question:

Obtenir un identifiant unique à partir d'un système de type Unix

Une fois que j’ai également vu certains programmes baser leurs licences sur le numéro de série du disque dur, c’est peut-être la chose la moins susceptible de changer. Certains suggéreraient d'utiliser le MAC de votre carte Ethernet, mais cela peut être reprogrammé.

4
SystematicFrank

Ne comptez pas sur MAC et VOLUME ID !!!!! 

La connexion à un serveur de validation peut également causer de nombreux problèmes pour les raisons suivantes:
* vos clients ne sont peut-être pas toujours connectés à Internet.
* vos clients peuvent se connecter avec des paramètres spéciaux (routeur/NAT/proxy/passerelle) qu’ils doivent saisir dans votre programme pour le laisser se connecter au serveur de validation.
* ils peuvent être derrière un pare-feu qui bloquera tous les programmes sauf quelques-uns (mon cas). Dans certains cas, le pare-feu peut ne pas être sous leur contrôle (valable pour la plupart des utilisateurs d'entreprise)! 

Si vous avez besoin d'une protection renforcée, vous devez vous fier à l'ID du matériel.

Voici une bibliothèque qui offre EXACTEMENT ce que vous voulez: un moyen fiable de lire l'identifiant matériel d'un ordinateur. Entre autres, il peut lire l'ID du processeur et l'ID du disque dur, tous deux uniques et qui ne changeront jamais (oui, même après le formatage de l'ordinateur et la réinstallation de Windows).

Une application de démonstration compilée démontre que les identifiants sont uniques et permanents: http://www.soft.tahionic.com/download-hdd_id/index.html

Il existe également du code source de démonstration pour de nombreux langages de programmation: http://www.soft.tahionic.com/download-hdd_id/hardware%20ID%20programmer%27s%20DLL.html

L'utilisation de la bibliothèque est aussi simple que d'appeler une seule fonction (après avoir chargé le DLL en mémoire, bien sûr).

0
Rigel