c++ - Generando una ID de hardware en Windows
unique uuid (6)
¿Cuál es la mejor manera de generar una ID de hardware única en Microsoft Windows con C ++ que no sea fácil de falsificar (por ejemplo, cambiando la dirección MAC)?
Aquí hay un programa (también disponible como DLL ) que puede leer y mostrar su ID de computadora / hardware: http://www.soft.tahionic.com/download-hdd_id/index.html
Este solía ser el número de serie de la CPU, pero hoy en día hay muchos tipos de placas base y este factor no es exacto. La dirección MAC se puede forjar fácilmente. Eso nos deja con el número de serie del disco duro interno. Ver también: http://www.codeproject.com/Articles/319181/Haephrati-Searching-for-a-reliable-Hardware-ID
Existen varios ID asignados al hardware que se pueden leer y combinar para formar una clave de máquina. Por ejemplo, puede obtener la ID del disco duro donde se almacena el software, la ID de proceso, etc. Algunos de estos pueden configurarse más fácilmente que otros, pero parte de la fuerza está en la combinación de varias piezas que no necesariamente son lo suficientemente fuerte por sí mismos.
Hay una variedad de "trucos", pero la única "respuesta física" real es "no, no hay solución".
Una "máquina" no es más que un bus pasivo con algún hardware alrededor. Aunque cada pieza de hierro puede proporcionar un identificador de alguna manera utilizable, cada pieza de hierro puede ser reemplazada por un usuario por cualquier razón buena o mala de la que nunca pueda estar completamente al tanto (por lo que si basa su funcionalidad en esto, creará problemas en su usuario, y por lo tanto, como consecuencia, para usted mismo cada vez que un hardware deba ser reemplazado / reinicializado / reconfigurado, etc.).
Ahora, si su problema es identificar una máquina en un contexto donde muchas máquinas tienen que interactuar entre sí, este es un rol bien jugado por las direcciones IP o MAC o los nombres de host. Pero prepárese para la idea de que no son necesariamente constantes en un período de tiempo prolongado (así que evite codificarlos en su lugar, en lugar de eso, "descubra entonces" en cualquiera de sus inicios)
Si su problema es, en lugar de identificar una instancia de software o una licencia, probablemente tenga que concentrarse en otro tipo de solución: vende licencias a "usuarios" (¡es el usuario el que tiene el dinero, no su computadora!), no a sus "máquinas" (que los usuarios deben poder cambiar libremente siempre que lo necesiten / gusten sin su permiso, ya que no tiene licencia del hardware ni del sistema operativo ...), por lo tanto, su problema no es identificar una máquina, sino un USUARIO (considere que una misma máquina puede ser un host para muchos usuarios y que un mismo usuario puede trabajar en una variedad de máquinas ..., no puede asumir / imponer una relación 1: 1, sin encontrarse con algún tipo de problema antes o más tarde, cuando este idioma no se ajuste más).
La idea debería ser registrar a los usuarios en un sitio al que se pueda acceder, darles las claves que genere y verificar que un mismo usuario / par de claves no se use de forma simultánea más de un número acordado de veces en un período de tiempo determinado. Cuando las violaciones superan, o las claves se vuelven antiguas, simplemente bloquee y espere a que el usuario renueve.
Como puede ver, la respuesta depende principalmente de la razón detrás de su pregunta, más que de la pregunta en sí.
Utilice las API de HDS del sistema Win32. No lea el registro, no tiene ningún sentido en absoluto.
Windows almacena un Guid único por máquina en el registro en:
HKEY_LOCAL_MACHINE/Software/Microsoft/Cryptography/MachineGuid