Génération d’un ID d’ordinateur basé sur le matériel

J’ai eu une question concernant la génération d’un identifiant d’ordinateur spécifique à des fins de licence. De préférence, cet identifiant doit être basé sur le matériel, et ne doit donc pas changer si l’utilisateur reformate par exemple. En outre, il ne devrait pas être facile (ou de préférence même impossible) pour l’utilisateur de modifier les informations à partir desquelles l’ID est généré. Actuellement, je n’ai que deux composants à combiner, le standard CPUID et les indicateurs de caractéristiques, ainsi que la géomésortinge et la taille totale du premier disque physique de la machine. Bien que cela semble être une bonne chose pour la plupart des PC, beaucoup de netbooks, par exemple, sont fabriqués avec le même matériel et vous obtiendrez donc le même identifiant pour de nombreuses machines. L’un de vous peut-il suggérer un autre composant matériel que je pourrais utiliser?

J’ai deux exigences:

  1. Il ne doit pas utiliser WMI.

  2. Il doit fonctionner dans un grand nombre de situations (y compris pour les utilisateurs avec peu ou pas de privilèges). J’ai pensé utiliser la série du lecteur physique, mais cela semble difficile à récupérer si l’utilisateur n’est pas en mode administrateur.

Je travaille en C ++ sous Windows.

Merci d’avance pour toute suggestion.

Sincères amitiés,

Philip Bennefall

Vous pouvez utiliser la première adresse MAC, qui est atsortingbuée par le fabricant du matériel et ne changera jamais.

Quelque chose comme ça:

/** return ssortingng containing first MAC address on computer requires adding Iphlpapi.lib to project */ ssortingng GetMac() { char data[4096]; ZeroMemory( data, 4096 ); unsigned long len = 4000; PIP_ADAPTER_INFO pinfo = ( PIP_ADAPTER_INFO ) data; char sbuf[20]; ssortingng sret; DWORD ret = GetAdaptersInfo( pinfo, &len ); if( ret != ERROR_SUCCESS ) return ssortingng("**ERROR**"); for(int k = 0; k < 5; k++ ) { sprintf(sbuf,"%02X-",pinfo->Address[k]); sret += sbuf; } sprintf(sbuf,"%02X",pinfo->Address[5]); sret += sbuf; return( sret ); } 

IMHO, cela est suffisant pour les licences de logiciels d’une valeur allant jusqu’à mille dollars, où tout ce qui est nécessaire est d’empêcher les consommateurs occasionnels de partager votre logiciel avec leurs voisins. Un pirate motivé peut contourner le problème, mais les pirates ayant une connaissance et une motivation suffisantes ne sont pas assez fréquents pour que vous en dépensiez plus pour essayer de les vaincre et, plus important encore, vous ne voulez pas déranger vos clients honnêtes.

Si votre logiciel est tellement précieux que les pirates motivés constituent une véritable menace, le coût et les inconvénients d’une clé matérielle deviennent alors justifiés.

Je ne crois pas non plus en empilant davantage de signatures matérielles, d’identifiants de lecteurs de disques, de configurations de cartes mères, etc. L’augmentation de la sécurité est minime et la probabilité que quelque chose ne se passe pas comme prévu augmente considérablement. Vous perdrez donc des heures à supporter les clients avec des configurations inhabituelles et des nombres inconnus qui vous abandonnent.

Implémentez un système simple avec l’adresse MAC, qui semble toujours fonctionner. Acceptez le fait qu’un pirate occasionnel puisse recevoir ses coups de pied en cas de violation de votre licence. Concentrez vos efforts sur l’amélioration de vos logiciels pour gagner des clients plus honnêtes.

Un système peut avoir plus d’une carte réseau (par exemple Ethernet et sans fil) et il est possible pour l’utilisateur de modifier l’ordre de présentation (pourquoi un utilisateur le ferait-il?). Pour gérer cela, une licence doit correspondre à une carte réseau présente n’importe où sur le système, nécessitant du code comme ceci:

 /** The MAC addresses of ethernet network cards present on computer @param[out] vMAC vector of ssortingngs containing MAC addresses in XX-XX-XX-XX-XX-XX format returns empty vector on error See discussion of this http://stackoverflow.com/questions/6131123/generating-hardware-based-computerid/6131231#6131231 */ void cLicenser::GetMac( vector < string >& vMac ) { vMac.clear(); char data[4096]; ZeroMemory( data, 4096 ); unsigned long len = 4000; PIP_ADAPTER_INFO pinfo = ( PIP_ADAPTER_INFO ) data; DWORD ret = GetAdaptersInfo( pinfo, &len ); if( ret != ERROR_SUCCESS ) return; while ( pinfo ) { if( pinfo->Type == MIB_IF_TYPE_ETHERNET ) ( // ignore software loopbacks and other strange things that might be present continue; char sbuf[20]; ssortingng sret; for(int k = 0; k < 5; k++ ) { sprintf(sbuf,"%02X-",pinfo->Address[k]); sret += sbuf; } sprintf(sbuf,"%02X",pinfo->Address[5]); sret += sbuf; vMac.push_back( sret ); } pinfo = pinfo->Next; } } 

J’ai essayé de faire quelque chose de similaire il y a quelques années et j’ai échoué. J’ai essayé d’utiliser une combinaison d’identifiants matériels que je pouvais lire. La plupart des processeurs ont un CPUID, un numéro unique utilisé pour les identifier et les suivre de manière unique. Cependant, le problème est qu’il n’est pas volontaire que chaque CPU ait cet identifiant. En fait, quand je l’ai essayé, la série Intel Celeron n’avait pas cet identifiant. Certaines cartes mères (principalement Intel) sont également livrées avec un identifiant unique que vous pouvez utiliser.

Voici un lien vers un article décrivant comment obtenir cette information.

J’ai également utilisé n’importe quel / tous les identifiants MAC en combinaison avec l’ID du processeur et l’identifiant MB en tant que germe pour générer un GUID unique. Plus vous utilisez d’ID de matériel comme graine, mieux c’est. Si vous mettez à jour l’un des composants matériels, le problème est que l’ID change et que la clé du logiciel est invalidée.

Gardez également à l’esprit que les machines virtuelles compliquent encore plus la situation. Je pense que votre meilleur pari serait de faire ce que fait Microsoft.

Microsoft utilise une approche similaire où il prend une empreinte matérielle d’une machine sur laquelle le système d’exploitation est installé et la communique avec la clé d’enregistrement pour activer une copie de la suite OS / Office. Si vous mettez à niveau votre matériel de manière significative (je pense à 4 composants matériels), la clé changera et vous devrez contacter Microsoft et fournir des preuves pour re-valider votre copie de Windows.

Si vous avez seulement besoin de le générer une fois, le GUID sera unique à la machine qui l’a créé. Le problème est que vous obtiendrez une valeur différente chaque fois que vous en générerez un. Mais s’il s’agit d’une application unique par machine, un GUID fonctionnera.

Si elle doit être identique par machine et générée plusieurs fois, l’adresse MAC correspond à l’identifiant universel des machines (même si vous pouvez choisir parmi plusieurs MAC).

Si cela était facile et fiable, Microsoft l’aurait trouvé et breveté il ya longtemps.

Il y a eu des tentatives de protection de logiciels par certains doo-dad, y compris l’envoi d’ un «dongle» avec chaque logiciel sous licence. Hey précieux nouveau client! Il suffit de twigr le dongle et de lancer votre nouveau logiciel!

C’était une émeute de voir un arrangement de trois ou quatre dongles Rube Goldberg branché à un autre et suspendu au port parallèle, chacun permettant son propre progiciel.

L’une des nombreuses options consiste à utiliser l’ID du processeur. Mieux que le registre Windows ou la carte réseau, par exemple. Vous ne voulez pas que les utilisateurs vous dérangent chaque fois qu’ils changent de carte réseau, etc. Je pense que cpuid project peut être utilisé comme exemple et comme sharepoint départ.