Надежный способ генерации уникального идентификатора оборудования - PullRequest
26 голосов
/ 16 мая 2010

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

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

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

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

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

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

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

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

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

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

Ответы [ 4 ]

7 голосов
/ 16 мая 2010

То, что вы ищете, это 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.

7 голосов
/ 16 мая 2010

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

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

4 голосов
/ 20 мая 2010

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

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

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

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

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

0 голосов
/ 07 января 2011

НЕ ПОЛЬЗУЙТЕСЬ МАКОМ И ОБЪЕМОМ ID !!!!!

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

Если вам нужна надежная защита, вам нужно использовать аппаратный идентификатор.

Вот библиотека, которая предлагает именно то, что вы хотите: надежный способ чтения идентификатора оборудования компьютера. Среди прочего, он может считывать идентификаторы процессора и жесткого диска, которые являются уникальными и никогда не изменятся (да, даже после форматирования компьютера и переустановки 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 в память).

...