我想知道根据机器的某些组件手动生成硬件密钥的最佳方法是什么。
事情是这样的:我只希望某些类型的机器能够与我的服务器进行通信。为了做到这一点,我想确保他们的硬件只是我的服务器识别(或接受)的“允许的硬件”的一部分。
我想根据所述硬件生成一个密钥,以便我可以在服务器端检查它并确保它属于“允许的”范围。
理想情况下,它会“检查”
- 处理器
- 母板
- 以太网网络接口
内存和硬盘有点棘手,因为它们可能经常变化。
我正在使用 Ubuntu 10.10,并且我已经看到该lshw
命令提供了有关……嗯……有关所有内容的大量信息。另外, cat /proc/cpuinfo
,dmidecode
...所有这些都显示了很多信息,我总是可以用正则表达式解析这些信息并做...事情,但我想知道是否有更干净更直接的方法。
对于此事的任何提示或建议将不胜感激。
谢谢。
答案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
来自等的输出lspci
,dmidecode
但如果有任何轻微的硬件更改(例如添加更多内存或添加另一个网卡),或者即使这些工具的输出发生变化,这也会导致问题。
商业软件通常使用网卡的 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