【问题标题】:Best way to generate a machine fingerprint?生成机器指纹的最佳方法?
【发布时间】:2011-12-25 17:21:59
【问题描述】:

我需要生成一个不同机器的唯一字符串——“设备指纹”。

什么是……

  • 自定义实现的可能方法? (我有一些想法,但我认为你们可能有更好的想法)
  • 现有的解决方案? (商业/非商业均可)

【问题讨论】:

  • 当用户升级CPU/内存/硬盘/网卡/等时,您希望指纹改变还是保持不变...
  • 你能给我们一个更详细的用例吗?你的机器是移动的吗?您是否能够安装证书等(而不是专用设备)?您是否控制/拥有机器或它们所在的网络?
  • 提醒任何感兴趣的人——对于我们的用例,我们最终决定设备指纹识别并不是那么重要。

标签: .net windows hardware fingerprinting


【解决方案1】:

如果您想涵盖许多边缘情况(例如硬件升级、操作系统升级等),并且如果您担心人们花费精力来伪造已知良好的设备指纹(好意思),那么设备指纹识别是一个复杂的主题指纹为您所知并获得一些好处,例如软件使用权),或者创建一个您不知道的全新指纹(例如指纹在某种黑名单上,并且用户想要创建一个新设备不在黑名单上的设备的 ID)。

有些事情是相当静态的,是简单指纹的合理基础。 MAC 地址最适合该类别,但也很容易更改。此外,某些计算机有多个 MAC 地址(包括来自虚拟机的 MAC),因此您需要处理这种复杂性。一些网络设备是短暂的,例如绑定手机。

计算机的其他方面更难(但并非不可能)伪造,例如 CPU 信息、BIOS 校验和、硬盘驱动器序列号等。然而,那些往往更难伪造的东西也更多可能会发生变化(BIOS 升级、新硬盘驱动器、可移动硬盘驱动器等)。

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

【讨论】:

    【解决方案2】:

    嗯,我对我的应用程序所做的通常是通过从Environment 中找到的机器名称中获取哈希值来创建一个特殊 ID,将它与我的应用程序名称的哈希值连接起来,然后应用一个盐(甚至可能不是必要但偏执会有所帮助)为应用程序/机器组合生成“指纹”。

    这适用于我的情况,因为机器上一次只有一个我的应用程序副本。

    【讨论】:

    • 这种方法有点脆弱,但对于许多用例来说可能没问题。在现实世界中,机器名称确实会不时更改。如果大型客户端决定更改机器命名方案,则会导致大量安装失败。
    • 没错,但我没有回答安装指纹的问题。我使用我的指纹进行应用程序之间的通信,即监控其他几个应用程序以获取状态/错误报告的应用程序。这就是我这样做的原因。
    • 当然,OP 还没有说明用例。当然适用于许多场景。
    【解决方案3】:

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

    【讨论】:

    • 如何在 vmware 中获取物理 MAC?我在 Vmware 和虚拟网卡上有不同的 mac。
    【解决方案4】:

    您可以使用 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

    【讨论】:

    • 卷序列号在硬盘更换/升级后无法保留。
    • 我知道,这是最后的选择,只有在您无法从 WMI 获得任何信息的情况下才可以
    【解决方案5】:

    您想要的某些内容可能取决于您对相关系统的了解程度。例如,您的个人和/或网络防火墙和 VLAN 可能会阻止您询问设备本身。我发现针对网络基础设施中的设备(您的交换机获取 MAC 地址信息,以及您的路由器获取 IP 地址)进行 SNMP 查询可以提供很好的快速图片。否则,NMAP 就是你的朋友。

    【讨论】:

      【解决方案6】:

      Windows 和 Mac 设备的 UUID 绑定到硬件或专门绑定到主板 BIOS。

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

      Windows(reference 和更多方式)

      wmic csproduct get UUID
      

      Mac (reference)

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-16
        • 2010-12-02
        • 1970-01-01
        • 1970-01-01
        • 2017-03-23
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多