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

8
我需要生成一个唯一的字符串,以便在每台机器上都不同 - "设备指纹"。
有哪些可能的自定义实现方法?(我有一些想法,但我认为你们可能有更好的想法)
现有的解决方案有哪些?(商业和非商业均可接受)

1
当用户升级他们的CPU / 内存 / 硬盘 / 网卡等时,您想要指纹更改还是保持不变? - Mark Byers
能否给我们提供更详细的使用案例?你们的机器是移动的吗?是否能够安装证书之类的东西(而非专用设备)?你们对机器或其所在网络拥有控制权/所有权吗? - phatfingers
提醒一下所有感兴趣的人——对于我们的用例,我们最终决定设备指纹识别并不是非常重要。 - Joshua Evensen
6个回答

3
设备指纹识别是一个复杂的主题,如果想涵盖许多边缘情况(例如硬件升级、操作系统升级等),并且担心人们会花费精力伪造一个已知良好的设备指纹(良好意味着您知道指纹并获得某些利益,如软件使用权),或者创建一个您不知道的全新指纹(例如指纹在某种黑名单上,用户想要为不在黑名单上的设备创建新的设备ID)。
有些东西相对静态,是简单指纹的合理基础。MAC地址最适合这类别,但也非常容易更改。此外,一些计算机具有几个MAC地址(包括来自虚拟机的MAC地址),因此您需要处理这种复杂性。一些网络设备是短暂的,例如通过手机热点连接上去的电脑。
计算机的其他方面更难(但并非不可能)伪造,例如CPU信息、BIOS校验和、硬盘序列号等。然而,那些倾向于更难伪造的东西也更可能发生变化(BIOS升级、新硬盘、可移动硬盘等)。
您还需要仔细考虑保护实际生成指纹的代码。如果该代码容易(足够)被黑客攻击,试图打败您方案的人将直接插入他们想要的任何指纹到收集和评估组件的代码中。

1

您可以使用WMI获取网卡MAC地址、硬盘序列号(不是卷序列号)、CPU ID和BIOS ID。这种方法的缺点是,在某些机器上由于几个原因,其中一些信息可能无法获得,但您可以从这4个来源中组合信息,至少会有一个可用,但在某些机器上,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 Tester测试WMI。


1
卷序列号在更换/升级硬盘后无法保留。 - Eric J.
我知道这是最后的选择,只有在你无法从WMI获取任何信息的情况下才能使用。 - Antonio Bakula

1

我通常在应用程序中所做的是通过从环境中找到的机器名称的哈希来创建一个特殊的ID,将其与我的应用程序名称的哈希值连接起来,然后应用盐(可能甚至不必要,但这有助于产生对于应用程序/机器组合的“指纹”)。

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


1
那种方法有点脆弱,虽然对于许多用例来说可能还可以。在现实世界中,机器名称确实会不时更改。如果一个大客户决定更改机器命名方案,那将导致很多安装失效。 - Eric J.
没错,但我并不是在回答关于指纹识别用于安装的问题。我使用指纹识别进行应用程序间通信,特别是为了监控其他几个应用程序的状态/错误报告的应用程序。这就是我这样做的原因。 - Jeff LaFay
1
当然,OP尚未说明用例。对于许多情况,它肯定能够很好地工作。 - Eric J.

1
现在大多数机器都有带有MAC地址的NIC(如果它没有连接到网络,那么您为什么需要该机器的唯一标识符?)。只需确保获取物理NIC的MAC地址而不是虚拟mac(由VMWare或Virtualbox创建)。您可能希望存储MAC来自的设备的名称,以便在枚举MAC地址时始终获取相同的MAC地址。此外,不要将其用于安全性,因为始终可以伪造MAC地址,它只提供相对唯一的标识符。

如何在 VMware 中获取物理 MAC 地址?我在 Vmware 和虚拟 NIC 上有不同的 MAC 地址。 - Konrad

1

Windows和Mac设备都有一个UUID,它与硬件或特别是主板BIOS相关联。

您可以通过以下方式查询它。

Windows (参考文献 和更多方法)

wmic csproduct get UUID

Mac (reference)

可以翻译为:

Mac({{link1:参考}})


ioreg -d2 -c IOPlatformExpertDevice | awk -F\" '/IOPlatformUUID/{print $(NF-1)}'

0

你想要的一些内容可能取决于你对相关系统的可见性。例如,你可能有个人和/或网络防火墙以及VLAN,这些都会阻止你对设备本身进行询问。我发现针对网络基础设施中的设备进行SNMP查询(用于获取MAC地址信息的交换机和用于获取IP地址的路由器)可以快速获得良好的图像。否则,NMAP是你的好朋友。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接