Как можно однозначно идентифицировать компьютер?

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

Помимо использования MAC с сетевой карты, есть ли у кого-нибудь другие методы (которые работают как на Windows, так и на Mac OS X) для уникальной идентификации компьютера?

15 ответов


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

третье решение-предоставить менеджер лицензий. То есть, когда программное обеспечение запускается, оно запрашивает сервер в Сети (либо в локальной сети клиента, либо в вашей компании через интернет), который проверяет законность использования программного обеспечения клиентом. Это хорошее решение для "параллельных лицензий", поэтому клиенты могут устанавливать ваше программное обеспечение на многих хостах, но вы лицензируете его для одновременного использования на ограниченном количестве хостов. Flexnet Publisher является примером решения для управления лицензиями.

MAC-адрес сетевой карты-это решение, которое я использовал в прошлый раз, когда работал в компании, которая лицензировала программное обеспечение для запуска на определенном хозяин.

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

"мы обновили наш сервер до гигабита сетевой адаптер, а теперь лицензия не будет работать, потому что новый адаптер ля другой MAC-адрес."

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

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

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


Я буду играть адвоката дьявола здесь и сказать вам, что что-то вроде этого, вероятно, не лучшая вещь для обсуждения в "обществе".

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


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

Это если бы это было реальным требованием. Моя первая задача - попытаться убедить клиента, что это была плохая идея.

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

Если вы должны сделайте это, я просто сделаю символическое усилие, чтобы встретить договорное обязательство (однако не говорите об этом своему клиенту). Принимая MAC-адрес (или случайное число, если,$DEITY запретить, на компьютере не было сетевой карты) в качестве ключа запроса и с помощью программы просто XOR это с строкой ASCII, чтобы получить ключ активации, кажется работоспособным подходом. Я бы также сохранил оба ключа, так как вы не хотите, чтобы программное обеспечение деактивировалось, если они просто меняют свою сетевую карту (или даже материнскую плату) - они все еще видят, что как тот же компьютер и будет не радуйтесь, если программа перестанет работать.

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

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

  • ореолы их содержимое диска на большой жесткий диск делает серийные номера HD изменения.
  • использование серийных номеров CPU означает обновление до последней версии Intel bigmutha CPU kill вашего программного обеспечения.
  • использование MAC-адреса означает, что они не могут изменить свой NIC.

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


лучший способ-взять UUID с помощью C# в Windows

Лучший Способ Однозначно Идентифицировать Машину Windows

public string GetUUID()
{
    var procStartInfo = new ProcessStartInfo("cmd", "/c " + "wmic csproduct get UUID")
    {
        RedirectStandardOutput = true,
        UseShellExecute = false,
        CreateNoWindow = true
    };

    var proc = new Process() { StartInfo = procStartInfo };
    proc.Start();

    return proc.StandardOutput.ReadToEnd().Replace("UUID", string.Empty).Trim().ToUpper();
}

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

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

проверка онлайн-лицензии-еще один хороший способ - вы можете управлять всем на стороне сервера и даже определять свои собственные правила для него (сколько лицензий на клиента/установку, параллелизм и т. д.), Но важно отметить, что происходит, когда соединение не может быть установлено?


откройте реестр и перейдите к

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\криптография

найти ключ под названием "MachineGuid" этот ключ генерируется однозначно во время установки Windows, и он не будет меняться независимо от любой замены оборудования (кроме замены загрузочного жесткого диска, на котором установлена ОС). Это означает, что если вы хотите отслеживать установку per OS, это еще одна альтернатива. Он не изменится, если вы не сделаете новую переустановку Окна.


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

вещи, которые обновляются: -Память - MACs (можно подделать, USB-адаптеры подключаются и т. д.)

вещи, которые не часто обновляются : -ЦПУ -БИОС -Материнская плата

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

wmic cpu get DeviceId /format:value

это захватит идентификатор процессора, вы можете запустить эту команду для:

1-CPU (cpu: DeviceID) 2-материнская плата (плинтус: serialnumber) 3-BIOS (bios:serialnumber)

если вы не получите по крайней мере 2 заполненных значения, а затем захватить

4-сетевой адаптер - (nic: MACAddress) 5-RAM - (memphysical:SerialNumber)

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

вы можете использовать схему обмена ключами Диффи-Хеллмана, чтобы пользователь генерировал пару частных / pulic Ключей с идентификаторами их оборудования в качестве полезной нагрузки, а затем передавал эту информацию на сервер регистрации, где сервер регистрации будет использовать открытый/закрытый ключ для расшифровки полезной нагрузки и вычисления регистрационного ключа для возврата конечному пользователю. Мне нравится использовать JWT для передачи вещей взад и вперед с открытыми ключами, включенными в полезную нагрузку JWT. Надеюсь, это поможет.

UUID был упомянут выше, и это отличная идея, которую вы можете получить с:

wmic csproduct get UUID /format:vale

отказ от ответственности эти команды работают только для Windows, я думаю, 2000 и выше, но вам нужно будет проверить, они могут быть доступны для систем ниже 2000, но на данный момент я действительно стараюсь не поддерживать эти устройства. Удача.

На Mac:

system_profiler | grep "Serial Number (system)"

В Linux (debian):

sudo dmidecode -t system | grep "Serial Number"

dmidecode и system_profiler имеет другие компоненты он может захватить серийные номера от аналогичного wmic в windows. Я не работаю на macs, поэтому я не могу подтвердить список точных спецификаций, но создаю список LCD (наименьший общий знаменатель) серийные номера для частей, к которым могут получить доступ все три команды, собраны и обработаны до наименее вероятных частей, которые будут обновлены или изменены. Затем комбинация верхних 2-3 номеров хэшируется может сделать для уникального идентификатора машины это немного более надежно и позволяет активировать кросс-платформенное приложение даже на устройстве с обновленной операционной системой.


раньше в процессоре был серийный номер, насколько я видел; эта информация (PSN, серийный номер Pentium) была устаревшей. Информация, возможно, все еще существует, но, по крайней мере, в мире P3 она исчезла. Кроме того, я думаю, что очевидный выбор MAC-адреса на NIC для основного интерфейса, используемого для хоста, следует рассматривать как реальную возможность. Если ваш клиент не ожидает, что интерфейсы ethernet будут присутствовать на хостах, которые они продают к.


У меня есть некоторый опыт в этом. В моем решении мы выдаем сервисный ключ, когда продаем продукт клиенту.

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

мы поддерживаем приложение администратора в организации при выдаче ключей активации. Мы предлагаем только один ключ активации для ключа для конкретного сервисного ключа.

мы продали несколько копий, и он работает без проблем. Но потом мы узнали некоторые компьютеры, которые не предоставляют серийный номер материнской платы. Эти машины возвращают нулевое значение в качестве серийного номера материнской платы. мы все еще пытаемся решить эту проблему.


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


можно создать серийный ключ, который пользователь должен ввести один раз. Он должен включать адрес электронной почты пользователя (что-то вроде someuser@mailprovider.com-9828372-398232). Это остановит многих людей от попыток вмешаться в него или дать его другим людям. Во время активации программное обеспечение следует проверять на онлайн БД, если серийный ключ существует.


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


или вы можете просто не иметь кода активации и гарантировать, что у вас есть права аудита, записанные в EULA, и время от времени осуществлять свое право на аудит.

творит чудеса для Oracle.


Как насчет хэширования всего, что имеет сгоревший SN, жесткий диск, proc, ram и т. д... этот хэш останется с компьютером, пока он не заменит его части.


HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\криптография

ключ"MachineGuid" генерируется однозначно во время установки Windows, и он не будет меняться независимо от любой замены оборудования (кроме замены загрузочного жесткого диска, на котором установлена ОС). Я в этом не уверен.

МОЕ ПРЕДЛОЖЕНИЕ

вы можете использовать этот MachineGuid, серийный номер жесткого диска, серийный номер материнской платы и UUID. Вместе хэшировать его с помощью SHA 256 или любая другая хэш-функция.

UUID - wmic csproduct получить UUID

MachineGuid - HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\криптография

Серийный Номер Жесткого Диска - wmic diskdrive получить serialnumber

серийный номер BIOS - wmic bios получить serialnumber

Серийный Номер Материнской Платы - wmic плинтус получить serialnumber