根据机器的部分硬件组件生成密钥(数字?)

根据机器的部分硬件组件生成密钥(数字?)

我想知道根据机器的某些组件手动生成硬件密钥的最佳方法是什么。

事情是这样的:我只希望某些类型的机器能够与我的服务器进行通信。为了做到这一点,我想确保他们的硬件只是我的服务器识别(或接受)的“允许的硬件”的一部分。

我想根据所述硬件生成一个密钥,以便我可以在服务器端检查它并确保它属于“允许的”范围。

理想情况下,它会“检查”

  • 处理器
  • 母板
  • 以太网网络接口

内存和硬盘有点棘手,因为它们可能经常变化。

我正在使用 Ubuntu 10.10,并且我已经看到该lshw命令提供了有关……嗯……有关所有内容的大量信息。另外, cat /proc/cpuinfodmidecode...所有这些都显示了很多信息,我总是可以用正则表达式解析这些信息并做...事情,但我想知道是否有更干净更直接的方法。

对于此事的任何提示或建议将不胜感激。

谢谢。

答案1

我认为这个有趣的问题最终会困扰你。

您可以编写一个脚本来执行以下操作:

rm /tmp/hw_snapshot
touch /tmp/hw_snapshot
cat /proc/cpuinfo | grep <whatever> >> /tmp/hw_snapshot
dmidecode | grep <whatever> >> /tmp/hw_snapshot
lspci | grep <whatever> >> /tmp/hw_snapshot
md5sum /tmp/hw_snapshot > /tmp/key

不,您的硬件配置有一个唯一的标识符。问题是,即使在同一型号系列中,硬件也可能有很大差异,包括 CPU、网卡、网卡数量等。所以基本上,如果有人有一个惠普DL380模型,然后获取另一个带有额外网卡的模型,添加您的唯一密钥不再有效。

另外,我仍然不明白硬件基础限制通信的目的。如果你想控制与你的机器对话的内容,请将可以与它一起放在专用网络上的东西(如果可以的话)。

答案2

虽然您可以仅创建md5sum来自等的输出lspcidmidecode但如果有任何轻微的硬件更改(例如添加更多内存或添加另一个网卡),或者即使这些工具的输出发生变化,这也会导致问题。

商业软件通常使用网卡的 MAC 地址进行许可证管理,但这可以被伪造,例如麦换格

如前所述,您最好将这些系统置于访问受限的专用网络中,例如使用 VPN。

答案3

钥匙?为什么不使用 SSH 或 VPN?

您可以使用 MAC 地址的供应商部分 - 但这很容易被伪造。

答案4

嗯......我用你们给我的答案“炖了一顿”,我得到了一些适合我需要的东西,也许有人可能会觉得有用。它是一个 Python 脚本,直接连接到 U-Dev(据我所知,这是dmidecode内部使用的),获取一堆值并用它们生成 SHA256 密钥。我只使用了有关网络设备、BIOS 和主板的信息。这对我来说已经足够好了(它可以更改...U-Dev 提供关于...关于您系统拥有的一切的信息)

#!/usr/bin/env python    
import hashlib
import pyudev

if __name__ == "__main__":
    retval = None
    context = pyudev.Context()
    borrajaxHardwareKey = unicode()
    for netDevice in context.list_devices(subsystem="net"):
        actualDevice = netDevice.parent
        if actualDevice is not None:
            tmpList = list()
            try:
                tmpList.append(actualDevice.attributes.asstring("vendor"))
                tmpList.append(actualDevice.attributes.asstring("device"))
            except KeyError:
                tmpList = list()
            if len(tmpList) > 0:
                borrajaxHardwareKey = u"," + borrajaxHardwareKey + u":".join(tmpList)

    dmiThingy = pyudev.Device.from_path(context, '/sys/devices/virtual/dmi/id')
    dmiThingyValidAttrs = list()
    for dmiThingAttr in ["bios_vendor", "sys_vendor", "product_name", "board_vendor", "board_name"]:
        try:
            dmiThingyVal = dmiThingy.attributes.asstring(dmiThingAttr).strip()
            if len(dmiThingyVal) == 0:
                raise KeyError()
            else:
                dmiThingyValidAttrs.append(dmiThingyVal)
        except KeyError:
            pass

    borrajaxHardwareKey = u"," + borrajaxHardwareKey + u":".join(dmiThingyValidAttrs)
    print "1) Before hashing (do not use this one):\n\'%s\'" % borrajaxHardwareKey
    borrajaxHardwareKey = hashlib.sha256(borrajaxHardwareKey).hexdigest()
    print "2) After hashing:\n%s" % borrajaxHardwareKey

相关内容