Вопрос: Я должен придумать уникальный идентификатор для каждого сетевого клиента, такого что:
Определенное объяснение и некоторая предыстория:
Этим вопросом является в основном возраст старый вопрос, который также касается темы программной защиты от копирования, поскольку некоторые механизмы, используемые в той области, упоминаются здесь. Я должен быть ясным в этой точке, что я не ищу схему защиты от копирования. Продолжать читать.:)
Я работаю над программным обеспечением клиент-сервер, которое, как предполагается, работает в локальной сети. Одна из проблем, которые я должен решить, должна идентифицировать каждый уникальный клиент в сети (не большая часть проблемы), так, чтобы я мог применить определенные атрибуты к каждому определенному клиенту, сохранить и осуществить те атрибуты в течение времени жизни развертывания определенного клиента.
В то время как я искал решение, я знал о следующем:
Очевидный выбор для этого вида проблемы состоял бы в том, чтобы узнать идентификаторы BIOS (не 100%, уверенных, если это уникально через идентичные модели материнской платы, хотя), поскольку это - единственная вещь, на которую я могу полагаться, который не дублирован, передан путем клонирования, и это не может быть изменено (по крайней мере, не при помощи некоторой программы пространства пользователя). Все остальное перестало работать как любой являющийся не надежный (клонирование MAC, кто-либо?), или слишком требовательный (в терминах, что это слишком чувствительно к изменениям конфигурации).
Дополнительный вопрос, который я хотел бы спросить, я делаю его правильно, мудрый архитектурой? Возможно, существует лучший инструмент для задачи, которую я должен выполнить...
Другой подход, который я имел в виду, является чем-то подобным механизму квитирования, где сервер поддерживает внутреннюю справочную таблицу связанных клиентских идентификаторов (который может быть даже абсолютно основанным на программном обеспечении и групповым в любой данный момент), и говорит клиенту придумывать другой идентификатор во время квитирования, если дублирующийся идентификатор предоставлен после соединения. Тот подход, к сожалению, не играет приятно с одним из требований для связи атрибутов с определенным клиентом в течение времени жизни.
Мне кажется, что вы должны построить уникальный ID, соответствующий вашим требованиям. Этот ID может быть построен как хэш (например, MD5, SHA1 или SHA512) из важной для вас информации (некоторые сведения о программном и аппаратном компоненте).
Вы можете сделать ваше решение более безопасным, если подпишете такой хэш своим закрытым ключом, а ваша программа при запуске проверит, что ключ (подписанное значение хэша) подписан (только открытый ключ должен быть установлен вместе с вашей программой). Подобное решение можно расширить с помощью различных онлайн-сервисов, но корпоративным клиентам онлайн-сервисы могут показаться не очень приятными.
Вам нужен 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.
Многие программы используют hostId для создания кода лицензии (например, программ, основанных на FlexLM). Посмотрите, что делает Matlab в зависимости от операционной системы:
http://www.mathworks.com/support/solutions/en/data/1-171PI/index.html
Также посмотрите это вопрос:
Получение уникального идентификатора из unix-подобной системы
Однажды я также видел, как некоторые программы основывают свои лицензии на серийном номере жесткого диска, и, возможно, это вряд ли изменится. Некоторые предложат использовать MAC-адрес вашей сетевой карты, но его можно перепрограммировать.