2009-05-26 5 views
15

Quelle est la meilleure façon de générer un ID matériel unique sur Microsoft Windows avec C++ qui n'est pas facilement usurpable (avec par exemple la modification de l'adresse MAC)?Génération d'un ID de matériel sous Windows

+1

Définir "facilement spoofable" - c'est-à-dire que votre grand-mère pourrait le faire, seulement l'élite hacker, ou personne du tout? – GalacticCowboy

Répondre

16

Windows stocke un Guid unique par machine dans le registre:

HKEY_LOCAL_MACHINE\Software\Microsoft\Cryptography\MachineGuid 
+0

Vous pouvez l'utiliser avec le nom de votre programme comme clé d'une fonction de hachage HMAC dans CAPI. –

+2

Est-ce standard sur toutes les versions de Windows? Qu'en est-il de Windows Mobile? – JoshBerke

+0

La question serait "comment est-ce facile de parodie ...?" – jesup

0

Il existe différents ID attribués au matériel qui peuvent être lus et combinés pour former une clé de la machine. Par exemple, vous pouvez obtenir l'ID du disque dur où le logiciel est stocké, l'ID de proc, etc. Certains d'entre eux peuvent être définis plus facilement que d'autres, mais une partie de la force est de combiner plusieurs pièces qui ne sont pas nécessairement assez fort par eux-mêmes.

-1

Utilisez les API Win32 System HDS. Ne lisez pas le registre, il n'a aucun sens du tout.

+0

Vous souhaitez partager un lien? HDS ne montre rien. –

1

Il existe une variété de "trucs", mais la seule vraie "réponse physique" est "non, il n'y a pas de solution".

Une "machine" n'est rien de plus qu'un bus passif avec du matériel autour. Bien que chaque morceau de fer puisse fournir un identifiant utilisable en quelque sorte, chaque morceau de fer peut être remplacé par un utilisateur pour quelque raison mauvaise ou bonne que vous ne pouvez jamais connaître complètement (donc si vous basez votre fonctionnalité dessus, vous créez des problèmes). votre utilisateur, et donc, par conséquent, à vous chaque fois qu'un matériel doit être remplacé/réinitialisé/reconfiguré, etc., etc.). Maintenant, si votre problème est d'identifier une machine dans un contexte où plusieurs machines doivent interagir ensemble, c'est un rôle bien joué par les adresses MAC ou IP ou les noms d'hôtes. Mais soyez préparés à l'idée qu'ils ne sont pas nécessairement constants sur une longue période de temps (évitez donc de les coder en dur - au lieu de "découvrir ensuite" lors de votre démarrage)

Si votre problème est - au lieu de identifier une instance de logiciel ou une licence, mieux vaut se concentrer sur un autre type de solution: vous vendez des licences aux "utilisateurs" (c'est l'utilisateur qui a l'argent, pas son ordinateur!), pas à leurs "machines" (que les utilisateurs doivent être libres de changer quand ils en ont besoin sans votre permission, puisque vous n'avez pas de licence sur le matériel ou le système d'exploitation ...), votre problème n'est donc pas d'identifier une machine, mais un utilisateur. machine peut être un hôte pour de nombreux utilisateurs et qu'un même utilisateur peut travailler sur une variété de machines ..., vous ne pouvez pas supposer/imposer une relation 1: 1, sans tomber dans un genre de problèmes tôt ou tard, lorsque cette idiome trouvé pas plus en forme). L'idée devrait être d'enregistrer les utilisateurs dans un site accessible, de leur donner les clés que vous générez, et de vérifier qu'un même utilisateur/paire de clés n'est pas utilisé temporairement plus d'un nombre convenu de fois dans un temps donné période. Lorsque les violations dépassent ou que les clés deviennent anciennes, il suffit de bloquer et d'attendre que l'utilisateur renouvelle.

Comme vous pouvez le voir, la réponse dépend principalement de la raison derrière votre question, plus que de la question elle-même.