Надежный способ генерации уникального идентификатора оборудования

Вопрос: Я должен придумать уникальный идентификатор для каждого сетевого клиента, например:

  • он (ID) должен сохраняться после установки клиентского программного обеспечения на целевом компьютере и должен продолжать сохраняться, если программное обеспечение будет повторно установлено на том же компьютере и в том же выпуске ОС,
  • он не должен меняться, если конфигурация оборудования изменяется в большинстве способов (кроме изменения материнской платы).
  • Когда жесткий диск с установленным клиентским программным обеспечением клонируется на другой компьютер с идентичной аппаратной конфигурацией (или, насколько это возможно,), клиентское программное обеспечение должно знать об этом изменении.

Немного об объяснении и некоторой предыстории:

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

Я работаю над клиент-серверным программным обеспечением, которое должно работать в локальной сети. Одной из проблем, которые я должен решить, является определение каждого уникального клиента в сети (не столько проблема), что я могу применять определенные атрибуты для каждого конкретного клиента, сохранять и применять эти атрибуты в течение срока службы развертывания определенного клиент.

Пока я искал решение, я знал о следующем:

  • Система активации Windows использует какой-то тяжелый механизм отпечатков пальцев, который чрезвычайно чувствителен к модификациям оборудования,
  • Программное обеспечение для создания образов дисков копирует все идентификаторы томов (привязанные к каждому разделу при форматировании) и пользовательские, уникально сгенерированные идентификаторы во время процесса установки, во время первого запуска или любым другим способом, который является строго программным обеспечением по своей природе и хранится в реестре или на жестком диске, поэтому очень легко путать два.

Очевидным выбором для такого рода проблем было бы найти идентификаторы BIOS (не на 100% уверены, что это уникально с помощью одинаковых моделей материнских плат), так как единственное, на что я могу положиться, это не дублировать, переносится путем клонирования, и это нельзя изменить (по крайней мере, не используя некоторую программу для пользователя). Все остальное не может быть либо ненадежным (клонирование MAC, кто угодно?), Либо слишком требовательным (в том смысле, что он слишком чувствителен к изменениям конфигурации).

Вопрос, который я хотел бы задать, заключается в том, что я делаю это правильно, по архитектуре? Возможно, есть лучший инструмент для выполнения задачи, которую я должен выполнить...

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

Ответ 1

Мне кажется, что вы должны создать уникальный идентификатор, соответствующий вашим требованиям. Этот идентификатор может быть сконструирован как хэш (например, MD5, SHA1 или SHA512) из важной для вас информации (некоторая информация о программном и аппаратном компоненте).

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

Ответ 2

Что вы ищете, это Windows WMI. Вы можете получить идентификатор материнской платы (который уникален для одного и того же типа материнской платы) или многие другие типы уникальных идентификаторов и придумать какую-то умную серированную функцию для генерации UHID. Эй, я просто составляю акроним?

И если вы ищете специально для получения идентификатора материнской платы (BIOS):

WMI class: Win32_BIOS
Namespace: \Root\Cimv2

Документация: http://msdn.microsoft.com/en-us/library/aa394077(VS.85).aspx
Пример кода: http://msdn.microsoft.com/en-us/library/aa390423%28VS.85%29.aspx

Изменить. Вы не указали язык (и я предположил, что С++), но это можно сделать на Java (с помощью COM-драйвера) и на любом .NET-языке.

Ответ 3

Многие программы используют hostId для создания кода лицензии (например, на основе FlexLM). Посмотрите, что делает Matlab в зависимости от операционной системы:

http://www.mathworks.com/support/solutions/en/data/1-171PI/index.html

Также посмотрите на этот вопрос:

Получение уникального идентификатора из unix-подобной системы

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

Ответ 4

MAC
Не полагайтесь на MAC! КОГДА-ЛИБО. Это не постоянно. Пользователь может легко изменить его (до 30 секунд).

Идентификатор тома
Не полагайтесь на том ID! КОГДА-ЛИБО. Это не постоянно. Пользователь может легко изменить это. Он также изменяется путем простого форматирования диска.


WMI WMI это сервис. Может быть легко отключен. На самом деле, я попробовал это, и я обнаружил, что на многих компьютерах отключен или сломан (да, довольно часто сломан).

Лицензионный сервер
Подключение к серверу проверки может также вызвать много проблем, потому что:
 * Ваши клиенты не всегда могут быть подключены к Интернету.
 * ваши клиенты могут подключаться со специальными настройками (маршрутизатор/NAT/прокси/шлюз), которые им необходимо ввести в вашу программу, чтобы она могла подключаться к серверу проверки.
 * они могут находиться за брандмауэром, который блокирует все программы, кроме нескольких (в моем случае). В некоторых случаях брандмауэр может не находиться под их контролем (действительно для самых корпоративных пользователей)!
 * очень легко перенаправить вашу программу на локальный поддельный веб-сервер, который имитирует ваш сервер лицензирования.

Аппаратные данные
Если вам нужна надежная защита, вам нужно полагаться на аппаратное обеспечение. То, что не может быть отредактировано пользователем. Что-то вроде инструкции ID процессора, доступной в процессорах Intel/AMD, и серийного номера, записанного в интерфейсе IDE привода.
ID процессора и HDD ID являются постоянными. Они никогда не изменятся даже после форматирования компьютера и переустановки Windows.

Это выполнимо. Например, эта библиотека считывает идентификатор оборудования компьютера. Существует скомпилированная демонстрация, а также исходный код /​​DLL. Отказ от ответственности: ссылка ведет на коммерческий продукт (19 €/нет роялти).