我需要生成一个因机器而异的唯一字符串——“设备指纹”。
什么是...
- 自定义实现的可能方法?(我有一些想法,但我认为你们可能有更好的想法)
- 现有的解决方案?(商业/非商业均可)
我需要生成一个因机器而异的唯一字符串——“设备指纹”。
什么是...
好吧,我对我的应用程序所做的通常是通过从中找到的机器名称中获取哈希值来创建一个特殊的 ID,将Environment
它与我的应用程序名称的哈希值连接起来,然后应用盐(可能甚至没有必要,但它有助于成为偏执狂)为应用程序/机器组合生成“指纹”。
这适用于我的情况,因为机器上一次只有一个我的应用程序副本。
大多数机器现在都有一个带有 MAC 地址的 NIC(如果它没有连接到网络,那么你需要机器的唯一 ID 做什么?)。只需确保您获取的是物理网卡的 MAC 地址,而不是虚拟 mac(由 VMWare 或 Virtualbox 创建)。您可能希望存储 MAC 来自的设备的名称,以便在枚举 MAC 地址时始终获得相同的 MAC 地址。也不要将其用于安全性,因为始终可以伪造 MAC 地址,它只是提供了一个相对唯一的标识符。
如果您想涵盖许多边缘情况(例如硬件升级、操作系统升级等),并且如果您担心人们花费精力来伪造已知良好的设备指纹(好意思是指纹是您知道并获得一些好处,例如软件使用权),或者创建一个您不知道的全新指纹(例如,指纹在某种黑名单上,并且用户想要为不在黑名单上的设备)。
有些事情是相当静态的,是简单指纹的合理基础。MAC 地址最适合该类别,但也很容易更改。此外,某些计算机有多个 MAC 地址(包括来自虚拟机的 MAC 地址),因此您需要处理这种复杂性。一些网络设备是短暂的,例如系留手机。
计算机的其他方面更难(但并非不可能)伪造,例如 CPU 信息、BIOS 校验和、硬盘驱动器序列号等。然而,那些更难伪造的东西也更有可能改变(BIOS 升级、新硬盘、可移动硬盘等)。
您还需要仔细考虑保护实际生成指纹的代码。如果该代码很容易(足够)被破解,那么试图破坏您的解决方案的人只需在收集和评估组件的代码中直接插入他们想要的任何指纹。
您可以使用 WMI 并获取 NIC MAC 地址、HDD 序列号(不是卷序列号)、CPU ID 和 BIOS ID。这种方法的缺点是,在某些机器上,由于多种原因,其中一些信息不可用,但您可以结合来自这 4 个来源的信息,并且至少会有一个,但某些机器上的 WMI 根本无法按预期工作,并且你必须有某种后备,一些surley可以在所有机器上工作的东西,例如。卷序列号。
另一个问题是您必须具有管理员权限才能通过 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
网卡 MAC:
SELECT MACAddress FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True
顺便提一句。您可以使用Paessler WMI Tester测试 WMI
您想要的某些内容可能取决于您对相关系统的可见性。例如,您的个人和/或网络防火墙和 VLAN 可能会阻止您询问设备本身。我发现针对网络基础设施中的设备(您的交换机获取 MAC 地址信息,以及您的路由器获取 IP 地址)的 SNMP 查询提供了一个很好的快速图片。否则,NMAP 就是你的朋友。