生成机器指纹的最佳方法是什么?

我需要生成一个独特的string,这将不同的机器之间 – “设备指纹”。

什么是…

  • 自定义实现的可能方法? (我有几个想法,但我认为你们可能有更好的)
  • 现有解决scheme (商业/非商业都可以接受)

Solutions Collecting From Web of "生成机器指纹的最佳方法是什么?"

设备指纹是一个复杂的话题,如果你想覆盖许多边缘案例(例如硬件升级,操作系统升级等),如果你担心人们花费精力去伪造一个已知好的设备指纹(指纹是指(例如软件使用权),或者创建一个您不知道的全新指纹(例如,指纹在某种黑名单上,并且用户想要创建一个新的设备ID设备不在黑名单上)。

有些东西是相当静态的,是一个简单指纹的合理基础。 MAC地址最适合这个类别,但也很容易改变。 另外,有些电脑有几个MAC地址(包括虚拟机的MAC),所以你需要处理这个复杂性。 一些网络设备是短暂的,例如系绳手机。

计算机的其他方面更难以伪造,例如CPU信息,BIOS校验和,硬盘序列号等等。然而那些难以伪造的东西也更有可能改变(BIOS升级,新硬盘,移动硬盘等)。

您还需要仔细考虑保护实际生成指纹的代码。 如果代码很容易被破解,那么试图破解你的解决方案的人将会直接在收集和评估组件的代码中插入他们想要的任何指纹。

那么我对我的应用程序做什么通常是通过从Environment找到机器名称哈希创建一个特殊的ID,连同我的应用程序名称的哈希值,然后申请盐(可能甚至不必要,但它有助于是偏执狂)为一个应用程序/机器组合产生“指纹”。

这在我的情况下工作,因为一次只有一个机器上的应用程序的副本。

大多数机器现在有一个带有MAC地址的网卡(如果它没有连接到网络上,那么你需要一个唯一的机器ID)。 只要确定你正在获取物理网卡的MAC地址,而不是虚拟MAC(由VMWare或Virtualbox创建)。 您可能希望存储MAC来自的设备的名称,以便在枚举MAC地址时始终获得相同的MAC地址。 也不要用它来保证安全性,因为它总是可以伪造一个MAC地址,它只是提供一个相对唯一的标识符。

一些你想要的可能取决于你对系统的可见性。 例如,您可能拥有个人和/或网络防火墙和VLAN,以防止您自行询问设备。 我发现,针对网络基础设施中的设备(交换机的MAC地址信息,以及路由器的IP地址)的SNMP查询提供了一个很好的快照。 否则,NMAP是你的朋友。

您可以使用WMI并获取NIC MAC地址,HDD串行(不是卷序列),CPU ID和BIOS ID。 这种方法的缺点是在某些机器上出于多种原因没有提供这些信息,但是您可以将来自该4个源的信息组合起来,并且至少有一个将在那里,但是某些机器上的WMI根本无法按预期工作,你必须有某种后备,比如说所有的机器都能工作。 音量序列号。

另一个问题是,您必须拥有管理员权限才能通过WMI获取此信息,我使用WMI的Windows服务解决了该问题,并将信息发送给应用程序。

以下是一些有趣的WMI查询:

硬盘连续剧:

 SELECT SerialNumber FROM Win32_PhysicalMedia where SerialNumber <> null 

BIOS系列:

 SELECT SerialNumber FROM Win32_BIOS where SerialNumber <> null 

CPU序列号:

 SELECT ProcessorID FROM Win32_Processor 

NIC MAC:

 SELECT MACAddress FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True 

顺便说一句。 您可以使用Paessler WMI测试器来测试WMI