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

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

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

Определенное объяснение и некоторая предыстория:

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

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

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

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

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

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

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

30
задан cxxl 25 November 2013 в 15:18
поделиться

3 ответа

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

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

8
ответ дан 28 November 2019 в 00:26
поделиться

Вам нужен 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

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

9
ответ дан 28 November 2019 в 00:26
поделиться

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

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

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

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

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

4
ответ дан 28 November 2019 в 00:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: