我需要生成一个唯一的字符串,在不同的机器上是不同的——一个"设备指纹"。
是什么……
- 自定义实现的可能方法?(我有一些想法,但我认为你们可能有更好的)
- 现有解决方案?(商业/非商业均可)
设备指纹是一个复杂的话题,如果你想涵盖许多边缘情况(例如硬件升级,操作系统升级等),如果你担心人们花费精力伪造一个已知的好设备指纹(好的意思是指纹是你知道的,并获得一些好处,如软件使用权),或者创建一个你不知道的全新指纹(例如指纹在某种黑名单上)。并且用户想要为不在黑名单上的设备创建一个新的设备ID)。
有些东西是相当静态的,是简单指纹的合理基础。MAC地址最适合这一类,但也很容易更改。此外,有些计算机有多个MAC地址(包括来自虚拟机的MAC地址),因此您需要处理这种复杂性。有些网络设备是短暂的,例如有线手机。
计算机的其他方面更难(但绝不是不可能)伪造,如CPU信息、BIOS校验和、硬盘序列号等。然而,那些难以伪造的东西也更容易改变(BIOS升级、新硬盘驱动器、可移动硬盘驱动器等)。
您还需要仔细考虑保护实际生成指纹的代码。如果该代码很容易(足够)被破解,那么试图破解您的解决方案的人就会直接在收集和评估组件的代码中插入他们想要的任何指纹。
我对我的应用程序所做的通常是通过从Environment
中找到的机器名称中提取哈希值来创建一个特殊的ID,将其与我的应用程序名称的哈希值连接起来,然后应用盐(可能甚至不是必要的,但它有助于偏执)来生成应用程序/机器组合的"指纹"。
这在我的情况下有效,因为一台机器上一次只有一个我的应用程序副本。
现在大多数机器都有一个带有MAC地址的网卡(如果它没有连接到网络,那么您需要机器的唯一id做什么?)只要确保您获得的是物理网卡的MAC地址,而不是虚拟MAC地址(由VMWare或Virtualbox创建)。您可能想要存储MAC来自的设备的名称,以便在枚举MAC地址时始终获得相同的MAC地址。也不要为了安全起见而使用这个,因为总是有可能伪造MAC地址,它只是提供一个相对唯一的标识符。
可以使用WMI获取网卡MAC地址,HDD串行(不是卷串行),CPU ID和BIOS ID。这种方法的缺点是,在某些机器上,由于一些原因,这些信息中的一些是不可用的,但是您可以将来自这4个来源的信息组合在一起,并且至少有一个将在那里,但是在某些机器上,WMI根本不像预期的那样工作,您必须有某种形式的后退,这在所有机器上都可能工作。卷序号
另一个问题是你必须有管理员权限才能通过WMI获得这些信息,我用windows服务解决了这个问题,它使用WMI并向应用程序发送信息。
下面是一些有趣的WMI查询:
硬盘序列:
SELECT SerialNumber FROM Win32_PhysicalMedia where SerialNumber <> null
BIOS系列:
SELECT SerialNumber FROM Win32_BIOS where SerialNumber <> null
CPU串行:SELECT ProcessorID FROM Win32_Processor
网卡MAC:
SELECT MACAddress FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True
顺便说一句。您可以使用Paessler WMI Tester测试WMI
Windows和Mac设备有一个UUID,该UUID绑定到硬件或主板BIOS。
您可以通过以下方式查询。
Windows(参考和更多方式)
wmic csproduct get UUID
Mac(参考)ioreg -d2 -c IOPlatformExpertDevice | awk -F" '/IOPlatformUUID/{print $(NF-1)}'
您想要的一些内容可能取决于您对所讨论的系统的可见性。例如,您可能有个人和/或网络防火墙和vlan,它们阻止您查询设备本身。我发现对网络基础设施中的设备(交换机获取MAC地址信息,路由器获取IP地址)的SNMP查询提供了一个很好的快速图像。否则,NMAP就是您的朋友。