C ++ получить идентификатор процессора - PullRequest
7 голосов
/ 14 апреля 2011

Эта тема в порядке. Как получить идентификатор процессора и материнской платы?

Я хотел получить идентификатор процессора, используя код C ++, не используя WMI или какую-либо стороннюю библиотеку.

ИЛИ что-нибудь на компьютере, которое оказывается уникальным. Одним из них является Ethernet ID, который снова можно удалить на некоторых машинах. Это я хочу использовать в основном для целей лицензирования.

Является ли идентификатор процессора уникальным и доступен на всех основных процессорах?

Ответы [ 3 ]

17 голосов
/ 14 апреля 2011

В последнее время у меня была похожая проблема, и я сделал следующее. Сначала я получил некоторые уникальные значения идентификации системы:

  • GetVolumeInformation для серийного номера жесткого диска

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

  • __ cpuid (и, в частности, поле серийного номера процессора PSN)

  • GetAdaptersInfo для MAC-адресов

Я взял эти значения и скомбинировал их произвольным, но детерминированным способом (читайте обновление ниже!) (добавление, ксоринг, деление и сохранение остатка и т. Д.). Перебирайте значения, как если бы они были строками, и проявляйте творческий подход. В конце вы получите байтовый литерал, который можно преобразовать в диапазон букв и цифр ASCII, чтобы получить уникальный, «читаемый» код, который не выглядит как шум.

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

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

Важное обновление : С этого поста я узнал несколько вещей о криптографии, и я считаю, что составление произвольной комбинации (по сути, вашего собственного хэша) почти наверняка плохая идея. Хеш-функции, используемые на практике, построены так, чтобы быть хорошо управляемыми (как при низкой вероятности коллизий) и их было трудно сломать (способность создавать значение, которое имеет то же значение хеш-функции, что и другое). Построение такой функции - очень сложная проблема для информатики, и если вы не квалифицированы, вы не должны пытаться. Правильный подход для этого состоит в том, чтобы объединить любую информацию об оборудовании, которую вы можете собрать (т. Е. Те, что я перечислил в посте) и использовать криптографический хеш или цифровую подпись для получения проверяемого и безопасного вывода. Не используйте криптографические алгоритмы сами Есть много ошибок уязвимости, которые требуют много знаний, чтобы избежать. Используйте хорошо известную и проверенную библиотеку для реализации алгоритмов.

4 голосов
/ 14 апреля 2011

Если вы используете Visual Studio, Microsoft предоставляет значение __cpuid в заголовке <intrin.h>.Пример на связанном сайте MSDN.

3 голосов
/ 14 апреля 2011

Хм ...

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

Где изобретать велосипед? Почему бы не использовать эти библиотеки? Любая серьезная причина?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...