Forma confiable de generar un ID de hardware único


Pregunta: Tengo que idear un identificador único para cada cliente en red, tal que:

  • it (ID) debe persistir una vez que el software del cliente está instalado en el equipo de destino, y debe continuar persistiendo si el software se reinstala en el mismo equipo y la misma instalación del sistema operativo,
  • no debe cambiar si la configuración de hardware se modifica en la mayoría de las formas (excepto cambiar la placa base)
  • Cuando el disco duro con el software cliente instalado se clona en otro equipo con una configuración de hardware idéntica (o, lo más similar posible), el software cliente debe ser consciente de ese cambio.

Un poco de explicación y un poco de historia:

Esta pregunta es básicamente una pregunta antigua que también toca el tema de la protección de copia de software, ya que algunos de los mecanismos utilizados en esa área se mencionan aquí. Debo ser claro en este punto que no estoy buscando un esquema de protección de copia. Por favor, sigue leyendo. :)

Estoy trabajando en un software cliente-servidor que se supone que funciona en una red local. Uno de los problemas que tengo que resolver es identificar cada cliente único en la red (no tanto como un problema), para que pueda aplicar ciertos atributos a cada cliente específico, retener y aplicar esos atributos durante la vida de implementación de un cliente específico.

Mientras buscaba una solución, me di cuenta de lo siguiente:

  • El sistema de activación de Windows utiliza algún tipo de huella dactilar pesada mecanismo que es extremadamente sensible a las modificaciones de hardware,
  • El software de imagen de disco copia a lo largo de todos los ID de volumen (vinculados a cada partición cuando se formatea), y los ID personalizados generados de forma única durante el proceso de instalación, durante la primera ejecución o de cualquier otra manera, que es estrictamente software en su naturaleza, y se almacena en el registro o en el disco duro, por lo que es muy fácil confundir dos.

La opción obvia para este tipo de problema sería encontrar identificadores de BIOS (no 100% seguro si esto es único a través de modelos de placa madre idénticos, sin embargo), ya que es la única cosa en la que puedo confiar que no se duplica, se transfiere por clonación, y que no se puede cambiar (al menos no mediante el uso de algún programa de espacio de usuario). Todo lo demás falla ya sea porque no es confiable(clonación de MAC, ¿alguien?), o demasiado exigente (en términos de que es demasiado sensible a los cambios de configuración).

La sub-pregunta que me gustaría hacer es, ¿lo estoy haciendo correctamente, en cuanto a arquitectura? Tal vez hay una mejor herramienta para la tarea que tengo que cumplir...

Otro enfoque que tenía en mente es algo similar a un mecanismo de apretón de manos, donde un servidor mantiene una tabla de búsqueda interna de ID de cliente conectados (que pueden incluso estar completamente basados en software y no ser únicos en un momento dado), y le dice al cliente que cree un ID diferente durante el apretón de manos, si se proporciona un ID duplicado durante la conexión. Ese enfoque, desafortunadamente, no juega muy bien con uno de los requisitos para empatar atributos al cliente específico durante la vida útil.

Author: cxxl, 2010-05-16

4 answers

Me parece que debería construir el ID único correspondiente a sus requisitos. Este ID se puede construir como un hash (como MD5, SHA1 o SHA512) a partir de la información que es importante para usted (alguna información sobre el componente de software y hardware).

Puede hacer que su solución sea más segura si firma dicho hash con su clave privada y su software verifica durante el inicio, que la clave (valor hash firmado) está firmada (solo la clave pública debe ser instalado junto con su software). Uno puede expandir este tipo de solución con diferentes servicios en línea, pero los clientes corporativos podrían encontrar servicios en línea no tan agradables.

 7
Author: Oleg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-09 09:16:44

Lo que estás buscando es el Windows WMI. Puede obtener el ID de la placa base (que es único en el mismo tipo de placa base) o muchos otros tipos de identificadores únicos y llegar a alguna función sembrada inteligente para generar un UHID. ¿Acabo de inventar un acrónimo?

Y si usted está buscando específicamente para obtener la placa base (BIOS) ID:

WMI class: Win32_BIOS
Namespace: \Root\Cimv2

Documentación: http://msdn.microsoft.com/en-us/library/aa394077 (VS.85).aspx
Código de ejemplo: http://msdn.microsoft.com/en-us/library/aa390423%28VS.85%29.aspx

Editar: No especificaste un lenguaje (y asumí C++), pero esto se puede hacer en Java (con un controlador COM), y cualquier lenguaje.NET, también.

 7
Author: David Titarenco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-16 00:00:22

Muchos programas usan el hostID para construir un código de licencia (como los basados en FLEXlm). Eche un vistazo a lo que hace Matlab dependiendo del sistema operativo:

Http://www.mathworks.com/support/solutions/en/data/1-171PI/index.html

También echa un vistazo a esta pregunta:

Obtener un id único de un sistema similar a unix

Una vez también vi algunos programas basando sus licencias en el número de serie del disco duro, y tal vez eso sea lo menos lo más probable es que cambie. Algunos sugerirían usar el MAC de su tarjeta ethernet, pero eso se puede reprogramar.

 4
Author: SystematicFrank,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:31:52

¡NO CONFÍE EN MAC Ni EN EL ID DE VOLUMEN!!!!!

La conexión a un servidor de validación también puede causarle muchos problemas porque:
* es posible que sus clientes no siempre estén conectados a Internet.
* sus clientes pueden conectarse con configuraciones especiales (enrutador/NAT/proxy/gateway) que necesitan introducir en su programa para permitir que se conecte al servidor de validación.
* pueden estar detrás de un firewall que bloqueará todos los programas excepto algunos (mi caso). En algunos casos el firewall puede no estar bajo su control (válido para LA MAYORÍA de los usuarios corporativos)!

Si necesita una protección fuerte, debe confiar en el ID de hardware.

Aquí hay una biblioteca que ofrece EXACTAMENTE lo que desea: una forma confiable de leer el ID de hardware de un equipo. Entre otros, puede leer el ID de la CPU y el ID del disco duro, que son únicos y nunca cambiarán (sí, ni siquiera después de formatear el equipo y reinstalar Windows).

Hay una aplicación de demostración compilada que demuestra que de hecho, los IDs son únicos y permanentes: http://www.soft.tahionic.com/download-hdd_id/index.html

También hay código fuente de demostración para muchos lenguajes de programación: http://www.soft.tahionic.com/download-hdd_id/hardware%20ID%20programmer%27s%20DLL.html

El uso de la biblioteca es tan simple como llamar a una sola función (después de cargar el DLL en la memoria, por supuesto).

 1
Author: Everybody_hates_BillTheLizard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-04 23:55:10