根據機器的部分硬體組件產生密鑰(數位?)

根據機器的部分硬體組件產生密鑰(數位?)

我想知道根據機器的某些組件手動生成硬體密鑰的最佳方法是什麼。

事情是這樣的:我只希望某些類型的機器能夠與我的伺服器進行通訊。為了做到這一點,我想確保他們的硬體只是我的伺服器識別(或接受)的「允許的硬體」的一部分。

我想根據所述硬體產生一個密鑰,以便我可以在伺服器端檢查它並確保它屬於「允許的」。

理想情況下,它會“檢查”

  • 處理器
  • 主機板
  • 乙太網路介面

記憶體和硬碟有點棘手,因為它們可能經常變化。

我正在使用 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

相關內容