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

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

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

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

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

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

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

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

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

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

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

4 ответа

Решение

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

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

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

И если вы ищете специально для получения ID материнской платы (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

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

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

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

Также взгляните на этот вопрос:

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

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

Не полагайтесь на MAC и VOLUME ID!!!!!

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

Если вам нужна надежная защита, вы должны полагаться на ID оборудования.

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

Существует скомпилированное демонстрационное приложение, которое демонстрирует, что идентификаторы действительно уникальны и постоянны: http://www.soft.tahionic.com/download-hdd_id/index.html

Существует также демонстрационный исходный код для многих языков программирования: http://www.soft.tahionic.com/download-hdd_id/hardware%20ID%20programmer%27s%20DLL.html

Использование библиотеки - это просто вызов отдельной функции (конечно, после загрузки DLL в память).

Другие вопросы по тегам