Уникальная идентификация ПК на основе программного / аппаратного обеспечения - PullRequest
9 голосов
/ 03 сентября 2010

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

Это для приложения Windows, использующего wxWidgets, но Win32или другой вариант в порядке.

Я думал о MAC-адресе, но как насчет ноутбуков, которые могут регулярно отключать сетевую карту в режиме энергосбережения?Я сталкивался с GetCurrentHwProfile , но это не совсем похоже на то, что я хочу?

Ответы [ 7 ]

4 голосов
/ 03 сентября 2010

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

Как правило, вы закодируете постоянное магическое значение с помощью CryptProtectData с помощью CRYPTPROTECT_LOCAL_MACHINE, и в результате вы получите идентификатор вашей машины.

2 голосов
/ 03 сентября 2010

Я бы просто использовал метод MAC-адреса; когда беспроводные / сетевые карты выключены, они все еще отображаются в сетевых подключениях. Поэтому вы все равно сможете получить MAC.

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

О, и вы можете использовать серийный номер процессора, который поддерживает компьютер клиента.

1 голос
/ 17 ноября 2010

Я думаю, что здесь пока что нет действительно простого и уникального метода.

  1. GetVolumeInformation извлекает даже близко не уникальный идентификатор .....
  2. Чтобы использовать любой аппаратный серийный номерпроблематично, поскольку производители не всегда поддерживают его и, в особенности, сохраняют его уникальностью во всем мире
  3. GetCurrentHwProfile получает GUID, но на его значение влияет незначительное!аппаратные изменения ...
  4. Использование ключа продукта ... заставит U иметь дело с украденным программным обеспечением - существует множество пиратских установок по всему миру.
  5. Создание собственного GUID и сохранение его подРеестр (в любом месте) не предотвратит дублирование при клонировании изображения ....
    и т. д. ... С моей точки зрения, наилучшим способом является комбинирование: идентификатор тома + список MAC-адресов + идентификатор машины + имя компьютера.И, очевидно, управлять лицензионной политикой на стороне сервера; 0)

С уважением, Миккель.

1 голос
/ 03 сентября 2010

Как насчет использования серийного номера жесткого диска, на котором установлены окна?

Функция GetVolumeInformation () выдаст вам такой серийный номер.Чтобы получить доступ к идентификатору, назначенному производителем жесткого диска, вместо идентификатора, назначенного Windows, вы можете использовать класс Win32_PhysicalMedia.

Чтобы определить диск, на котором установлены окна, вы можете расширить переменную% windir, используяfunction ExpandEnvironmentStrings ()

Другой вариант, если ваша архитектура позволяет, это использовать UuidCreate () для генерации случайного GUID во время установки и постоянного его сохранения в реестре. Этот GUID может затем использоваться в качестве идентификатора в качествеДо тех пор, пока реестр остается. Новая база данных реестра обычно рассматривается как новая установка.

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

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

1 голос
/ 03 сентября 2010

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

0 голосов
/ 06 сентября 2010

Как насчет использования серийного номера процессора. Я помню, Microsoft использовала API для этого, который будет запускать необходимый ассемблерный код и предоставлять вам всевозможную информацию о процессоре, включая серийный номер. Не уверен, что он будет работать с чипами AMD или нет, я думаю, что это специфично для Intel.

Конечно, идентификатор процессора безопасен и достаточно статичен !!

0 голосов
/ 03 сентября 2010

Для теста с довольно мертвым мозгом я использую код ProductID операционной системы и имя компьютера - оба извлечены из реестра. Не совсем безопасный, но все равно претендует на безопасность.

редактировать

Чтобы ответить на вопрос Джона о том, какие ключи я читаю:

ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Windows NT \ CurrentVersion \ ProductID

SYSTEM \ CurrentControlSet \ Control \ ComputerName \ ComputerName \ ComputerName

...