Generando una identificación de máquina única

104

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 y concatenarlos juntos y aplicarles hash para obtener la identificación única. Mi pregunta es, ¿cuáles son los parámetros sugeridos que debo usar? 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 dos veces 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
HS.
fuente

Respuestas:

25

Analice el SMBIOS usted mismo y modifíquelo a una longitud arbitraria. Consulte la especificación PDF para todas las estructuras SMBIOS disponibles.

Para consultar la información de SMBIOS de Windows que podría utilizar EnumSystemFirmwareEntries, EnumSystemFirmwareTablesy GetSystemFirmwareTable.

IIRC, el "ID único" de la instrucción CPUID está obsoleto en P3 y versiones posteriores.

Jonas Gulle
fuente
14
Tenga en cuenta que estas funciones requieren al menos Windows Vista, Windows XP Professional x64 Edition, Windows Server 2008 o Windows Server 2003 con SP1.
jcoffland
33
Una nota para no hacer lo que hice, que fue llamar a GetSystemFirmwareTable ('RSMB' ...); y hash todo el búfer SMBIOSTableData. Funcionó muy bien hasta que me encontré con una estación de trabajo que escribió la temperatura interna de la CPU en esa tabla, lo que significa que mi identificación única cambiaba cada pocos segundos.
Thomas
¿Hay algún código fuente disponible para esta solución?
Just Shadow
@Thomas, ¿qué solución elegiste finalmente?
Smith
@Smith Mi objetivo era una identificación pequeña de 8 caracteres. Al leer la especificación, tomé decisiones sobre qué campos podrían variar y los excluí. Luego, durante muchos años, eliminé más campos que no son constantes de las máquinas. Finalmente, terminé almacenando una copia encriptada de los datos sin procesar que usé como entrada e hice una closeEnoughfunción para que aceptara una identificación que no coincida si solo variaba en 2 campos. También incluyo detalles sobre el procesador y el disco duro del sistema en mi hash porque al principio tuve colisiones entre sistemas idénticos.
Thomas
72

Tuve el mismo problema y después de investigar un poco decidí que lo mejor sería leer la MachineGuidclave de registroHKEY_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, incluido el aleatorio), o un número pseudoaleatorio, el último para las versiones más recientes del sistema operativo (después de XP SP2, creo, pero no estoy seguro). Si es un pseudoaleatorio en teoría, se puede falsificar, si dos máquinas tienen el mismo estado inicial, incluido el reloj de tiempo real. En la práctica, esto será raro, pero tenga en cuenta si espera que sea una base de seguridad que pueda ser atacada por piratas informáticos expertos.

Por supuesto, cualquiera puede cambiar fácilmente una entrada de registro para falsificar un GUID de máquina, pero lo que encontré es que esto interrumpiría el funcionamiento normal de tantos componentes de Windows que, en la mayoría de los casos, ningún usuario habitual lo haría (de nuevo, tenga cuidado para los hackers incondicionales).

Fabio Ceconello
fuente
6
Puede usar la bandera KEY_WOW64_64KEY para asegurarse de que siempre obtenga la versión "real" de la clave de registro, creo.
Colen
13
Si clona una imagen de unidad, esta permanecerá igual. Así que esto no es en absoluto seguro ni muy inseguro.
bitbonk
19
Para aclarar el punto, cuando pongo medidas DRM en el software, mi objetivo principal es evitar que las personas creen una grieta que permita a piratas "profesionales" vender copias ilegales del software sin ninguna limitación. No estoy tan preocupado por un hacker ocasional que clona el disco de su amigo solo para poder usar mi software. En tales casos, esas personas suelen tener más tiempo que dinero y, de todos modos, no lo pagarían. Si el software cuesta $ 100 y su salario es más de $ 50 / h, simplemente lo paga. La molestia le llevará más tiempo que 2 horas.
Fabio Ceconello
7
En particular, en un entorno donde Windows se instala clonando una imagen de máquina maestra, MachineGuid será idéntico para todos ellos.
nandhp
8
No si lo hace de forma correcta y legal, utilizando sysprep & all. Para aquellos que han pirateado copias de Windows y "simplemente clonan", eso es otro asunto. Pero, de todos modos, no los detendrían tan fácilmente.
Fabio Ceconello
34

Con nuestra herramienta de licencias consideramos los siguientes componentes

  • Dirección MAC
  • CPU (no es el número de serie, sino el perfil real de la CPU, como el 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 la tarjeta de video
  • Controlador IDE
  • Controlador SCSI

Sin embargo, en lugar de simplemente aplicar hash a los componentes y crear un sistema de aprobación / falla, creamos una huella digital comparable que se puede usar para determinar cuán diferentes son los perfiles de dos máquinas. Si la clasificación de diferencia está por encima de una tolerancia especificada, solicite al usuario que la active nuevamente.

Durante los últimos 8 años, en uso con cientos de miles de instalaciones de usuarios finales, hemos descubierto 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 SO clonadas.

Paul Alexander
fuente
1
¿Cómo se determina qué dirección MAC utiliza? Una máquina puede tener múltiples NIC y estas se agregan dinámicamente (conectarse a una nueva VPN a través de un subprograma agregará una NIC virtual). Algunos son virtuales, tienen tipo Ethernet y son difíciles de identificar como virtuales. Otros están arriba / abajo dependiendo de las condiciones de la red (wifi)
Marek
Usamos todas las NIC físicas, excepto las NICS virtuales, blue-tooth, etc. Todas se combinan para crear un hash unificado.
Paul Alexander
¿Por qué recomienda no utilizar el número de serie de la CPU?
Mojtaba Rezaeian
3
El número de serie de la CPU no se ha habilitado en un chip Intel durante años. Las llamadas al sistema aún existen, pero no devuelven un valor estable. No recuerdo lo que devuelve, ya sea datos ficticios o el mismo valor para todas las máquinas. de cualquier manera, no es una métrica de hardware confiable.
Paul Alexander
1
@PaulAlexander, ¿la herramienta a la que se refirió valida todos los parámetros que mencionó o algunos de ellos funcionarán? Porque los sistemas de hoy en día no suelen consistir en un CD-ROM
FaizanHussainRabbani
3

¿Qué hay de usar el UniqueID del procesador?

artilugio
fuente
14
¿No es una propiedad depreciada en estos días?
Jake Wilson
15
Quizás quiere decir "desaprobado" ... Los fabricantes de CPU comenzaron a colocar ID únicos en una etapa, pero debido a una reacción violenta sobre asuntos de privacidad, se detuvieron nuevamente. Por lo tanto, encontrará que algunos tienen una identificación única, pero la mayoría de las CPU modernas no.
TripleAntigen
1
Como referencia, solo un breve lote de Pentium III tuvo números de serie de CPU que se pudieran leer. Si bien las versiones posteriores tenían un número de serie, estaba deshabilitado de forma predeterminada. Pentium IV y las CPU posteriores simplemente no lo admitían en absoluto.
Paul Alexander
2

Odio ser el tipo que dice, "simplemente lo estás haciendo mal" (siempre odio a ese tipo;) pero ...

¿Tiene que generarse de forma repetida para la máquina única? ¿Podría simplemente asignar el identificador o hacer una clave pública / privada? ¿Quizás si pudiera generar y almacenar el valor, podría acceder a él desde las instalaciones de ambos sistemas operativos en el mismo disco?

Probablemente ha explorado estas opciones y no funcionan para usted, pero si no, es algo a considerar.

Si no se trata de la confianza del usuario, puede usar direcciones MAC.

Jonathan Adelson
fuente
5
Las direcciones MAC no funcionarán si la máquina no tiene una tarjeta de red.
Brian
7
@Brian: ¿realmente necesita un valor único para identificar una computadora que no tiene una tarjeta de red? Parece una apuesta bastante segura que la máquina tiene una tarjeta.
romandas
1

Debería considerar el uso de la dirección MAC en la tarjeta de red (si existe). Suelen ser únicos, pero pueden fabricarse. He usado software que genera su archivo de licencia basado en la dirección MAC de su adaptador de red, por lo que se considera una forma bastante confiable de distinguir entre computadoras.

Kyle Cronin
fuente
6
No, no lo son. Muchos fabricantes te permiten cambiarlos. Esto es muy útil cuando se trabaja con clústeres porque algunos de los proveedores le brindan todas las computadoras con la misma dirección MAC (nos encontramos con este problema hace unos años).
gizmo
Esta es una idea válida en muchos casos, la pregunta no especifica la suplantación de identidad o fuera de línea; generalmente desea generar una identificación única si desea identificarse en una red
Hurda
Es posible tener varios dispositivos de red en la misma máquina; no se le garantiza que siempre se detectarán en el mismo orden o que no se reemplazarán en algún momento. Es mejor usar algún hardware que probablemente sea más permanente.
Agi Hammerthief
1

Para una de mis aplicaciones, utilizo el nombre de la computadora si no es una computadora de dominio, o el SID de la cuenta de la máquina de dominio para las computadoras de dominio. Mark Russinovich habla de ello en esta publicación de blog, Machine SID :

El último caso en el que la duplicación de SID sería un problema es si una aplicación distribuida utiliza SID de máquina para identificar equipos de forma única. Ningún software de Microsoft lo hace y usar el SID de la máquina de esa manera no funciona solo por el hecho de que todos los DC tienen el mismo SID de la máquina. El software que se basa en identidades de computadora únicas utiliza nombres de computadora o SID de dominio de computadora (el SID de las cuentas de computadora en el dominio).

Puede acceder al SID de la cuenta de la máquina de dominio a través de LDAP o System.DirectoryServices.

cmcginty
fuente
1

En mi programa, primero compruebo Terminal Server y uso el WTSClientHardwareId. De lo contrario, la dirección MAC de la PC local debería ser la adecuada.

Si realmente desea utilizar la lista de propiedades que ya ha proporcionado dejar de lado cosas como Namee DriverVersion, Clockspeed, etc., ya que es, posiblemente, depende del sistema operativo. Intente generar la misma información en ambos sistemas operativos y omita lo que difiere entre ellos.

AngelBlaZe
fuente
1

Hay una biblioteca disponible para obtener información específica de hardware: Extractor de número de serie de hardware (CPU, RAM, HDD, BIOS)

ariwez
fuente
2
Es una biblioteca comercial de código cerrado.
Gab
@ Gab: el código fuente está disponible. Y el precio de la DLL (29) no es nada comparado con otras bibliotecas que se acercan incluso a los 2000 dólares. Entonces, sí, hace el trabajo.
InTheNameOfScience
0

¿Por qué no utilizar la dirección MAC de su tarjeta de red?

Brian Matthews
fuente
14
La dirección Mac puede ser falsificada
Henry B
Esta es una idea válida en muchos casos, la pregunta no especifica la proabilidad o fuera de línea; generalmente, desea generar una identificación única si desea identificarse en una red
Hurda
0

Tal vez haga un poco de trampa, pero la dirección MAC de un adaptador Ethernet de una máquina rara vez cambia sin que cambie la placa base en estos días.

bfabry
fuente
Muchos fabricantes te permiten cambiarlos. Esto es muy útil cuando se trabaja con clústeres porque algunos de los proveedores le brindan todas las computadoras con la misma dirección MAC (nos encontramos con este problema hace unos años).
gizmo
1
MAC es totalmente poco confiable porque se puede cambiar tan fácilmente (solo con una búsqueda en Google y verá muchas herramientas gratuitas que están haciendo esto). Lo mismo para WMI.
InTheNameOfScience
0

¿Puede extraer algún tipo de número de serie del fabricante o etiqueta de servicio?

Nuestra tienda es una tienda de Dell, por lo que utilizamos la etiqueta de servicio que es única para cada máquina para identificarlos. Sé que se puede consultar desde el BIOS, al menos en Linux, pero no sé cómo hacerlo en Windows.

Christopher Cashell
fuente
0

Tenía una restricción adicional, estaba usando .net express, por lo que no podía usar el mecanismo de consulta de hardware estándar. Entonces decidí usar Power Shell para hacer la consulta. El código completo se ve así:

Private Function GetUUID() As String
    Dim GetDiskUUID As String = "get-wmiobject Win32_ComputerSystemProduct  | Select-Object -ExpandProperty UUID"
    Dim X As String = ""
    Dim oProcess As New Process()
    Dim oStartInfo As New ProcessStartInfo("powershell.exe", GetDiskUUID)
    oStartInfo.UseShellExecute = False
    oStartInfo.RedirectStandardInput = True
    oStartInfo.RedirectStandardOutput = True
    oStartInfo.CreateNoWindow = True
    oProcess.StartInfo = oStartInfo
    oProcess.Start()
    oProcess.WaitForExit()
    X = oProcess.StandardOutput.ReadToEnd
    Return X.Trim()
End Function
usuario2515235
fuente
-1

Busque CPUID para una opción. Puede haber algunos problemas con los sistemas con varias CPU.

BCS
fuente