기계의 하드웨어 구성요소의 일부를 기반으로 키(숫자?)를 생성합니다.

기계의 하드웨어 구성요소의 일부를 기반으로 키(숫자?)를 생성합니다.

기계의 특정 구성 요소를 기반으로 하드웨어 키를 수동으로 생성하는 가장 좋은 방법이 무엇인지 궁금합니다.

문제는 다음과 같습니다. 특정 유형의 컴퓨터만 내 서버와 통신할 수 있기를 바랍니다. 그렇게 하기 위해 나는 그들의 하드웨어가 내 서버가 인식(또는 수락)하는 "허용된 하드웨어"의 일부인지 확인하고 싶습니다.

해당 하드웨어를 기반으로 키를 생성하여 서버 측에서 확인하고 "허용된 것"에 있는지 확인하고 싶습니다.

이상적으로는 "확인"합니다.

  • 프로세서
  • 마더보드
  • 이더넷 네트워크 인터페이스

메모리와 하드 드라이브는 꽤 자주 변경될 수 있기 때문에 약간 까다롭습니다.

lshw저는 Ubuntu 10.10을 사용하고 있으며 ... 음... 모든 것에 대해 꽤 많은 정보를 제공하는 명령을 보았습니다 . 또한, 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, 네트워크 카드, 네트워크 카드 수 등을 포함하여 하드웨어가 크게 다를 수 있다는 것입니다.HP DL380모델을 구입한 후 추가 네트워크 카드를 추가하여 다른 모델을 구입하면 고유 키가 더 이상 유효하지 않습니다.

게다가 통신에 대한 하드웨어 기반 제한의 목적을 아직도 이해하지 못합니다. 당신의 컴퓨터와 통신하는 것을 제어하려면 (가능하다면) 사설 네트워크에 있는 것들을 넣으십시오.

답변2

등에서 md5sum출력을 생성할 수도 있지만 하드웨어가 약간 변경되거나(예: 더 많은 메모리 또는 다른 네트워크 카드 추가) 해당 도구의 출력이 변경되는 경우에도 문제가 발생할 수 있습니다.lspcidmidecode

상업용 소프트웨어는 라이센스 관리를 위해 네트워크 카드의 MAC 주소를 사용하는 경우가 많지만 이는 다음과 같은 방법으로 위조될 수 있습니다.맥체인저.

이미 언급한 바와 같이 VPN 등을 사용하여 액세스가 제한된 개인 네트워크에 해당 시스템을 배치하는 것이 더 나을 것입니다.

답변3

열쇠? SSH나 VPN을 사용하지 않는 이유는 무엇입니까?

MAC 주소의 공급업체 부분을 사용할 수 있지만 이는 쉽게 위조될 수 있습니다.

답변4

글쎄요... 저는 여러분이 주신 답변으로 "스튜를 만들었습니다". 제가 필요로 하는 것에 효과가 있고 누군가가 유용하다고 생각할 수도 있는 뭔가를 얻었습니다. U-Dev(내부적으로 사용되는 것으로 알고 있음 dmidecode)에 직접 연결하고 여러 값을 가져와서 SHA256 키를 생성하는 Python 스크립트입니다. 저는 네트워크 장치, 바이오스, 마더보드에 대한 정보만 사용했습니다. 그것은 나에게 충분했습니다(변경될 수 있습니다... 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

관련 정보