我想知道根據機器的某些組件手動生成硬體密鑰的最佳方法是什麼。
事情是這樣的:我只希望某些類型的機器能夠與我的伺服器進行通訊。為了做到這一點,我想確保他們的硬體只是我的伺服器識別(或接受)的「允許的硬體」的一部分。
我想根據所述硬體產生一個密鑰,以便我可以在伺服器端檢查它並確保它屬於「允許的」。
理想情況下,它會“檢查”
- 處理器
- 主機板
- 乙太網路介面
記憶體和硬碟有點棘手,因為它們可能經常變化。
我正在使用 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