Windows - C ++ Få Processor ID

Indlæg af Hanne Mølgaard Plasc

Problem



Denne tråd er ok.
Sådan får du en processor og bundkort id?


Jeg ønskede at få processor ID ved hjælp af C ++ kode, der ikke bruger WMI eller nogen tredjepart lib.


ELLER noget på en computer, der viser sig at være unik.
En ting er Ethernet ID, men som igen kan fjernes på nogle maskiner. Dette jeg vil bruge mest for licens formål.


Er processor ID unik og tilgængelig på alle større processorer?

Bedste reference


Jeg har haft et lignende problem i det seneste, og jeg gjorde følgende. Først fik jeg nogle unikke systemidentifikationsværdier:



  • GetVolumeInformation til HDD serienummer [4]

  • GetComputerName (dette er naturligvis ikke unikt, men vores system bruger computernavne til at identificere kunder på et LAN, så det var godt for mig) [5]

  • \_\_ cpuid (og specifikt PSN-processorens serienummerfelt) [6]

  • GetAdaptersInfo til MAC-adresser [7]



Jeg tog disse værdier og kombinerede dem på en vilkårlig men deterministisk måde (læs opdateringen nedenfor!) (tilføjelse, xoring, dividering og overholdelse af resten osv.). Iterere over værdierne som om de var strenge og være kreative. I sidste ende får du en byte bogstavelig, som du kan omdanne til ASCII-serien af ​​bogstaver og tal for at få en unik 'læsbar' kode, der ikke ligner støj.


En anden tilgang kan simpelthen være at sammenkæde disse værdier og derefter 'dække dem op' med xoring noget over dem (og måske omdanne til breve igen).


Jeg siger det er unikt, fordi mindst en af ​​inputene skal være unik (MAC-adressen). Selvfølgelig har du brug for en vis forståelse af talteori for ikke at blæse væk denne unikhed, men det skal alligevel være godt nok.


Vigtig opdatering : Siden dette indlæg lærte jeg et par ting om kryptografi, og jeg mener, at der er en vilkårlig kombination (i det væsentlige din egen hash) næsten helt sikkert en dårlig ide. i praksis er konstrueret til at være velopdragen (som i lav sandsynlighed for kollisioner) og at være svære at bryde (evnen konstruere en værdi, der har samme hashværdi som en anden). Konstruktion af en sådan funktion er et meget hårdt computervidenskabsproblem og medmindre du er kvalificeret, bør du ikke forsøge. Den korrekte tilgang til dette er at sammenkæde de oplysninger, du kan indsamle om hardwaren (dvs. dem, jeg nævnte i posten) og bruge en kryptografisk hash eller digital signatur til at få en verificerbar og sikker udgang. Udfør heller ikke de kryptografiske algoritmer selv; der er masser af sårbarhed faldgruber, der tager masser af viden for at undgå. Brug et velkendt og betroet bibliotek til implementering af algoritmerne.

Andre referencer 1


Hvis du bruger Visual Studio, leverer Microsoft \_\_cpuid instrinsic i <intrin.h> header. Eksempel på den linkede msdn site. [8]

Andre referencer 2


Hm ...


Der er specielle biblioteker til at generere unik ID baseret på den installerede hardware (så for den angivne computer er dette ID altid det samme). De fleste af dem tager bundkort ID + HDD ID + CPU ID og blander disse værdier.


Vi genopfinder hjulet? Hvorfor ikke bruge disse biblioteker? Enhver alvorlig grund?