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

Лучшим решением будет решение на C / C ++ , но я возьму Objective-C, если другого выхода нет. Лучшее решение не требует привилегий root .

Любые идеи? Спасибо.

4
Pedro d'Aquino 26 Июн 2009 в 21:51
Дубликат stackoverflow.com/questions/933460/unique- hardware-id-in-macosx, у которого есть лучшие ответы, imho
 – 
yairchu
2 Май 2010 в 23:00

3 ответа

Лучший ответ

Предложение Эрика о system_profiler (и лежащем в его основе, но недокументированном SystemProfiler.framework) - ваша лучшая надежда. Ваше основное требование невозможно, и любое решение без поддержки оборудования будет довольно быстро взломано. Но вы можете создать разумный уровень обфускации, используя system_profiler и / или SystemProfiler.framework.

Я не уверен, что вам нужно здесь, но эти сообщения могут быть полезны:

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

Я повторю здесь то, что я сказал в первом сообщении: невозможно, точка, невозможно надежно гарантировать, что только ваш клиент может разговаривать с вашим сервером. Если это ваше основное требование, это не решаемая проблема. Я расширю это, сказав, что невозможно построить вашу программу так, чтобы люди не могли снимать с вас проверку, поэтому, если целью является лицензирование, это также не является полностью решаемой проблемой. Во втором посте выше обсуждается, как думать об этой проблеме с деловой, а не с инженерной точки зрения.

РЕДАКТИРОВАТЬ: Что касается вашего запроса на перезагрузку, помните, что Mac OS X имеет расширения ядра. Загрузив расширение ядра, всегда можно изменить то, как система видит себя во время выполнения без перезагрузки. В принципе, это был бы руткит Mac, который в принципе не сложнее руткита Linux. Вам необходимо тщательно продумать, кто ваш злоумышленник, но если среди ваших злоумышленников есть хакеры ядра Mac (что не является незначительной группой), то даже требование перезагрузки не является правдоподобным. Это не значит, что спуфинг не может раздражать большинство пользователей. Просто это всегда возможно для достаточно компетентного злоумышленника. Это верно для всех современных ОС; про Mac здесь нет ничего особенного.

3
Community 23 Май 2017 в 15:30
Спасибо. Вы, очевидно, хорошо разбираетесь в этом предмете. Чтобы прояснить ситуацию, я не работаю над защитой от копирования. Клиент - это безопасный веб-сайт, который очень боится мошенничества. У вас есть дополнительная информация о system_profiler, например откуда берутся его данные (если он напрямую опрашивает HW и т. д.)? Я погуглил "SystemProfiler.framework, но ничего не нашел.
 – 
Pedro d'Aquino
26 Июн 2009 в 22:59
Мой ответ оказался слишком длинным, чтобы идти сюда. Я опубликовал длинное введение в тему: robnapier.net/blog/understanding-systemprofiler-393
 – 
Rob Napier
27 Июн 2009 в 01:26
Кроме того, что касается мошенничества, обеспокоены ли вы тем, что ваших клиентов обманули, или вас беспокоит, что ваши клиенты являются причиной мошенничества? Я подозреваю второй случай. Вы решаете эту проблему на стороне сервера, ища поведения, указывающие на мошенничество, потому что вы никогда не можете доверять клиентскому приложению. Вам также нужно будет определить, сколько мошенничества вы готовы просто принять. В любой системе есть какое-то мошенничество, и цена избавления от него растет в геометрической прогрессии. Узнайте, как Visa и банки решают эти проблемы.
 – 
Rob Napier
27 Июн 2009 в 01:35

Инструмент / usr / sbin / system_profiler может предоставить вам список серийных номеров для различных аппаратных компонентов. Вы можете использовать эти значения в качестве текста для генерации хэша md5 или чего-то подобного.

3
Erik 26 Июн 2009 в 22:03
Да, я экспериментировал с этим. Дело в том, что я понятия не имею, откуда system_profiler берет свои данные, поэтому я не решаюсь на него полагаться - я боюсь, что он может быть слишком хрупким.
 – 
Pedro d'Aquino
26 Июн 2009 в 22:05
Но если вы создадите хеш, это не должно быть проблемой, потому что с учетом хеша невозможно с вычислительной точки зрения воссоздать хешированный объект.
 – 
samoz
26 Июн 2009 в 22:08
@samoz: Наверное, я плохо выразился. Представьте себе такой сценарий: мое приложение используется для идентификации клиентов веб-сайта (скажем, банка). Когда пользователь впервые входит на веб-сайт, я устанавливаю свое приложение на компьютер пользователя, запускаю system_profiler и хэширую вывод. Предположим, что в следующий раз, когда он войдет в систему, я хочу увидеть, что это тот же компьютер, что и раньше, поэтому я снова запускаю system_profiler. Но если он что-то подделал, скажем серийный номер своего диска, вывод system_profiler будет другим, и он сломает мою систему. В этом сценарии шифрование не имеет значения.
 – 
Pedro d'Aquino
26 Июн 2009 в 22:13
@Pedro: как это делает вещи более безопасными? Что делать, если у пользователя более одного компьютера? Что, если он или она обновит свое оборудование или получит новый компьютер? Не пытайтесь быть умнее ваших пользователей. Или, если это особенно требовательное к безопасности использование, вы можете посмотреть на такие вещи, как токены RSA SecurID для двухфакторной аутентификации.
 – 
Joe
27 Июн 2009 в 06:25
@Pedro: если пользователь хочет вас обмануть и носит достаточно технический характер, этот подход обречен на небезопасность. Например, нет никакого способа гарантировать, что приложение, которое они запускают, является тем, которое вы установили (или попросили их установить), а не взломанным вариантом, который всегда будет возвращать любую информацию об оборудовании, которую они хотят. Как сказал Роб, вам нужно обеспечить безопасность на стороне сервера, потому что это единственное место, которое вы действительно контролируете. Вы не можете доверять чему-либо, что работает на клиенте или исходит от него.
 – 
Gordon Davisson
27 Июн 2009 в 10:43

Как насчет получения MAC-идентификатора сетевой карты, подключенной к компьютеру с помощью ifconfig?

1
Alan Haggai Alavi 26 Июн 2009 в 21:53
@alan, samoz: К сожалению, да.
 – 
Pedro d'Aquino
26 Июн 2009 в 21:59
@samoz: После небольшого поиска, похоже, их легко подделать. Ты прав.
 – 
Alan Haggai Alavi
26 Июн 2009 в 21:59