Лучший способ создать отпечаток машины?
Мне нужно создать уникальную строку, которая будет отличаться от машины к машине - "отпечаток устройства".
Что...
- возможные подходы для пользовательских реализаций? (У меня есть несколько идей, но я думаю, что у вас, ребята, возможно, есть ЛУЧШИЕ)
- существующие решения? (оба коммерческих / не коммерческих приемлемы)
5 ответов
Отпечатки устройств - сложная тема, если вы хотите охватить множество крайних случаев (например, обновления оборудования, обновления ОС и т. Д.), И если вы беспокоитесь о людях, которые расходуют энергию, чтобы подделать заведомо хороший отпечаток устройства (это означает, что отпечаток пальца известна вам и получает некоторые преимущества, такие как права на использование программного обеспечения), или создайте совершенно новый отпечаток, о котором вы не знаете (например, отпечаток был в каком-то черном списке, и пользователь хочет создать новый идентификатор устройства для устройство, которого нет в черном списке).
Некоторые вещи довольно статичны и являются разумной основой для простого отпечатка пальца. MAC-адрес лучше всего подходит для этой категории, но его также очень легко изменить. Кроме того, некоторые компьютеры имеют несколько MAC-адресов (в том числе MAC-адреса виртуальных машин), поэтому вам необходимо справиться с этой сложностью. Некоторые сетевые устройства эфемерны, например привязанный сотовый телефон.
Другие аспекты компьютера сложнее (но ни в коем случае не невозможно) подделать, например информацию о процессоре, контрольную сумму BIOS, серийные номера жесткого диска и т. Д. Однако вещи, которые сложнее подделать, также могут измениться (Обновление BIOS, новый жесткий диск, съемные жесткие диски и т. Д.).
Вам также необходимо тщательно защитить код, который фактически генерирует отпечаток пальца. Если этот код легко (достаточно) взломать, кто-то, пытающийся победить ваше решение, просто вставит любой желаемый отпечаток пальца непосредственно в код, который собирает и оценивает компоненты.
Вы можете использовать WMI и получить MAC-адрес сетевой карты, последовательный жесткий диск (не последовательный том), идентификатор процессора и идентификатор BIOS. Недостатком этого метода является то, что на некоторых машинах по нескольким причинам часть этой информации недоступна, но вы можете комбинировать информацию из этого 4 источника, и по крайней мере один будет там, но WMI на некоторых машинах просто не работает должным образом и у вас должен быть какой-то запасной вариант, то, что работает на всех машинах, например. серийный номер тома.
Другая проблема заключается в том, что у вас должны быть права администратора, чтобы получать эту информацию через WMI. Я решил эту проблему с помощью службы Windows, которая использует WMI и отправляет информацию приложениям.
Вот некоторые из интересных запросов WMI:
Жесткие диски, сериалы:
SELECT SerialNumber FROM Win32_PhysicalMedia where SerialNumber <> null
BIOS серийный:
SELECT SerialNumber FROM Win32_BIOS where SerialNumber <> null
Серийный процессор:
SELECT ProcessorID FROM Win32_Processor
NIC MAC:
SELECT MACAddress FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True
Кстати. вы можете протестировать WMI с помощью Paessler WMI Tester
Большинство машин имеют сетевой адаптер с MAC-адресами (если он не подключен к сети, зачем вам нужен уникальный идентификатор для машины?). Просто убедитесь, что вы получаете MAC-адрес физического сетевого адаптера, а не виртуальный Mac (созданный VMWare или Virtualbox). Возможно, вы захотите сохранить имя устройства, с которого исходит MAC, чтобы вы всегда получали один и тот же MAC-адрес при перечислении MAC-адресов. Также не используйте это для безопасности, так как всегда можно подделать MAC-адрес, он просто предоставляет относительно уникальный идентификатор.
Хорошо, что я делаю со своими приложениями, обычно создаю специальный идентификатор, беря хеш из имени машины, найденного в Environment
, сопоставьте его с хеш-значением имени моего приложения, а затем примените соль (возможно, даже не обязательно, но это помогает быть параноиком), чтобы получить "отпечаток" для комбинации приложения / машины.
Это работает в моей ситуации, потому что на компьютере одновременно есть только одна копия моего приложения.
Устройства Windows и Mac имеют UUID, который привязан к оборудованию или конкретно к BIOS материнской платы.
Вы можете запросить его следующими способами.
Windows ( ссылка и другие способы)
wmic csproduct get UUID
Mac (ссылка)
ioreg -d2 -c IOPlatformExpertDevice | awk -F\" '/IOPlatformUUID/{print $(NF-1)}'
То, что вы хотите, может зависеть от вашей видимости в рассматриваемых системах. Например, у вас могут быть персональные и / или сетевые брандмауэры и VLAN, которые мешают вам опросить сами устройства. Я считаю, что SNMP-запрос к устройствам в вашей сетевой инфраструктуре (ваши коммутаторы для информации о MAC-адресах и ваши маршрутизаторы для IP-адресов) дает хорошую быструю картину. В противном случае, NMAP ваш друг.