Сгенерировать ключ (номер?) на основе части аппаратных компонентов машины

Сгенерировать ключ (номер?) на основе части аппаратных компонентов машины

Мне интересно, как лучше всего вручную сгенерировать аппаратный ключ на основе определенных компонентов машины.

Вот в чем дело: я хочу, чтобы только определенные типы машин могли общаться с моим сервером. Чтобы сделать это, я хотел бы убедиться, что их оборудование является частью "разрешенного оборудования", которое мой сервер распознает (или принимает).

Я хотел бы сгенерировать ключ на основе указанного оборудования, чтобы я мог проверить его на стороне сервера и убедиться, что он входит в число «разрешенных».

В идеале, это было бы «проверить»

  • Процессор
  • Материнская плата
  • Сетевой интерфейс Ethernet

С памятью и жестким диском все немного сложнее, поскольку они могут меняться довольно часто.

Я использую 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

Нет, у вас есть уникальный идентификатор для вашей конфигурации оборудования. Проблема в том, что даже в пределах одной и той же модельной линейки оборудование может сильно различаться, включая процессоры, сетевые карты, количество сетевых карт и т. д. Так что, в общем, если у кого-то естьHPDL380модель, а затем приобретает другую с дополнительной сетевой картой, добавленной, ваш уникальный ключ больше не действителен.

Плюс я все еще не понимаю цель аппаратного ограничения на связь. Если вы хотите контролировать то, что общается с вашей машиной, поместите то, что может, в частную сеть с ней (если можете).

решение2

Хотя вы можете просто создать набор md5sumвыходных данных из lspciи dmidecodeт. д., это вызовет проблемы, если произойдет небольшое изменение оборудования (например, будет добавлено больше памяти или другая сетевая карта) или даже если изменится вывод этих инструментов.

Коммерческое программное обеспечение часто использует MAC-адрес сетевой карты для управления лицензиями, но его можно подделать, например, с помощьюmacchanger.

Как уже было сказано, лучше всего разместить эти системы в частной сети с ограниченным доступом, например, с помощью 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

Связанный контент