Generando una identificación de máquina única
Necesito escribir una función que genere una identificación que sea única para una máquina determinada que ejecuta un sistema operativo Windows.
Actualmente, estoy usando WMI para consultar varios parámetros de hardware, concatenarlos y aplicar hash para derivar la identificación única. Mi pregunta es ¿cuáles son los parámetros sugeridos que debo utilizar? Actualmente, estoy usando una combinación de datos de BIOS\cpu\disk para generar la identificación única. Y estoy usando el primer resultado si hay varios resultados para cada métrica.
Sin embargo, me encontré con un problema en el que una máquina que arranca dualmente en 2 sistemas operativos Windows diferentes genera códigos de sitio diferentes en cada sistema operativo, lo que idealmente no debería suceder.
Como referencia, estas son las métricas que estoy usando actualmente:
Win32_Processor:UniqueID,ProcessorID,Name,Manufacturer,MaxClockSpeed
Win32_BIOS:Manufacturer
Win32_BIOS:SMBIOSBIOSVersion,IdentificationCode,SerialNumber,ReleaseDate,Version
Win32_DiskDrive:Model, Manufacturer, Signature, TotalHeads
Win32_BaseBoard:Model, Manufacturer, Name, SerialNumber
Win32_VideoController:DriverVersion, Name
Tuve el mismo problema y después de investigar un poco decidí que lo mejor sería leer MachineGuid
la clave de registro HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography
, como sugirió @Agnus. Se genera durante la instalación del sistema operativo y no cambiará a menos que realice otra instalación nueva del sistema operativo. Dependiendo de la versión del sistema operativo, puede contener la dirección MAC del adaptador de red incorporada (más algunos otros números, incluidos los aleatorios) o un número pseudoaleatorio, lo último para versiones más nuevas del sistema operativo (después de XP SP2, creo, pero no estoy seguro). Si, en teoría, es pseudoaleatorio, puede falsificarse: si dos máquinas tienen el mismo estado inicial, incluido el reloj en tiempo real. En la práctica, esto será poco común, pero tenga cuidado si espera que sea una base de seguridad que pueda ser atacada por piratas informáticos incondicionales.
Por supuesto, cualquiera también puede cambiar fácilmente una entrada de registro para falsificar un GUID de la máquina, pero lo que descubrí es que esto alteraría el funcionamiento normal de tantos componentes de Windows que en la mayoría de los casos ningún usuario normal lo haría (nuevamente, tenga cuidado). para hackers incondicionales).
Con nuestra herramienta de licencias consideramos los siguientes componentes
- Dirección MAC
- CPU (no el número de serie, sino el perfil de CPU real, como el paso a paso y el modelo)
- Número de serie de la unidad del sistema (no etiqueta de volumen)
- Memoria
- Modelo y proveedor de CD-ROM
- Modelo y proveedor de tarjeta de video
- Controlador IDE
- Controlador SCSI
Sin embargo, en lugar de simplemente mezclar los componentes y crear un sistema de aprobación/rechazo, creamos una huella digital comparable que se puede utilizar para determinar qué tan diferentes son dos perfiles de máquina. Si la clasificación de diferencia está por encima de una tolerancia especificada, solicite al usuario que la active nuevamente.
Hemos descubierto en los últimos 8 años de uso con cientos de miles de instalaciones de usuarios finales que esta combinación funciona bien para proporcionar una identificación de máquina única y confiable, incluso para máquinas virtuales e instalaciones de sistemas operativos clonados.
Analice el SMBIOS usted mismo y ajústelo a una longitud arbitraria. Consulte la especificación en PDF para conocer todas las estructuras SMBIOS disponibles.
Para consultar la información de SMBIOS desde Windows, puede utilizar EnumSystemFirmwareEntries
, EnumSystemFirmwareTables
y GetSystemFirmwareTable
.
IIRC, la "identificación única" de la instrucción CPUID está obsoleta desde P3 y versiones posteriores.