Как я могу защитить свой код с помощью уникального идентификатора оборудования в Ruby?

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

Мне нужен мой код для получения MAC-адреса любого компьютера при запуске и сравнения его с файлом, хранящимся на моем сервере. Я попытался создать уникальный серийный код из MAC-адреса, но гем «macaddr» возвращает ошибку на некоторых компьютерах. Этот код не работает на некоторых компьютерах:

require 'macaddr'
mac = Mac.addr
puts mac
# >> NoMethodError: undefined method 'pfamily' for nil:NilClass

Как я могу получить некоторые уникальные системные идентификаторы и построить из них серийный код? Есть ли другой способ получить уникальный идентификатор оборудования с компьютера в Ruby?


person lucaortis    schedule 13.02.2019    source источник
comment
В PR 25 есть исправление ошибки, но вряд ли оно будет объединено. Он просто добавляет проверку безопасности для вызова метода. Таким образом, это предотвратит ошибку, но может привести к потере информации об этих системах. Возможно, вы захотите либо разветвить драгоценный камень, либо изучить существующую вилку.   -  person Tom    schedule 13.02.2019
comment
@ Том, спасибо за ответ. Я оставлю это как последний вариант, я хотел бы использовать другие коды, кроме MAC-адреса. Поскольку также, если я решу ошибку, спасая ее, я не получу тот же адрес, как вы сказали. Например, вы знаете, как получить серийные номера оборудования?   -  person lucaortis    schedule 13.02.2019
comment
system_profiler SPHardwareDataType возвращает много информации, включая `UUID оборудования:`, которую вы можете вывести регулярным выражением. Я знаю, что это работает на macOS, но не могу проверить в другом месте. Возможно, вам придется проверить среду и использовать разные команды соответственно. Вы можете запустить это из Ruby, обернув его обратными кавычками или system ... или парой других способов.   -  person Tom    schedule 13.02.2019
comment
@ Том, это команда, которую вы запускаете на терминалах MacOS? К сожалению, у меня Windows, и я собираюсь распространять это приложение только через Windows. Должен ли я регистрировать вывод ipconfig /all или любой другой утилиты в файл, а затем анализировать его? Это лучший способ? На самом деле у меня есть приложение с графическим интерфейсом, и вызов system вызывает всплывающее окно cmd, поэтому я использую win32ole для вызова сценариев cmd из Ruby.   -  person lucaortis    schedule 13.02.2019
comment
stackoverflow.com/a/20832728/5399937 может быть что-то вроде этого? Это не совсем моя сильная сторона, но мне самому любопытно.   -  person Tom    schedule 13.02.2019
comment
@ Том, я использую стандартный Ruby, а не Rails, но я думаю, что сделаю следующее на машине с Windows: wmic csproduct get "UUID" #Unique UUID. wmic nic get "MACAddress" #All MAC addresses on the computer. Это только для Windows. Я думаю, что эти команды почти такие же, как утилита macOS system_profiler. Я попробую это, и если это сработает, я обновлю свой вопрос или отвечу на него. Я думаю, что более безопасным способом является объединение UUID и MAC-адреса вместе, чтобы сделать лицензионный код, все еще не безопасный на 100%, но он должен помешать обычному пользователю скопировать и вставить код в другое место.   -  person lucaortis    schedule 13.02.2019
comment
Давайте продолжим это обсуждение в чате.   -  person lucaortis    schedule 13.02.2019
comment
Поскольку это Ruby, как помешать пользователю просто изменить код Ruby, выполняющий проверку?   -  person Stefan    schedule 13.02.2019
comment
@Stefan, код будет загружен при запуске приложения, и обычный пользователь не сможет изменить код, хорошо, рубин прост, но я не думаю, что кто-то справится с этим. Кроме того, все это сжато в exe-файл. Опять же, если кто-то, у кого есть навыки кодирования, попытается взломать это, раньше или позже, конечно, он это сделает. Но человек, который не знает, как получить код из экзешника, то и не сможет.   -  person lucaortis    schedule 13.02.2019


Ответы (2)


Во-первых, я бы рекомендовал вам НЕ использовать MAC-адреса. Это можно очень легко подделать.

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

Вместо этого я бы рекомендовал какую-то систему входа в систему, отправить имя пользователя и хэш (пароль) на сервер, получить обратно UUID. Каждый раз, когда кто-то использует программное обеспечение (или каждый час, в зависимости от того, что лучше подходит вашему программному обеспечению), пингуйте ваш сервер с помощью uuid, чтобы убедиться, что пользователь не вошел в систему на другом компьютере. Будьте великодушны в том, как вы справитесь со случаем, когда ваше программное обеспечение не получает ответа, не блокируйте программное обеспечение сразу - подождите час, может быть, даже день. Если это подходит для вашего программного обеспечения, появится небольшое предупреждение о том, что программное обеспечение будет заблокировано, если оно не обнаружит подключение к Интернету в течение X минут.

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

person user208769    schedule 13.02.2019
comment
Спасибо за ответ. Как сказано в моих комментариях, я хочу, чтобы это приложение было связано с машиной. Я не буду его нигде публиковать, я просто хочу, чтобы пользователь не копировал его на другие компьютеры, поэтому это должно работать только на компьютере клиента. - person lucaortis; 13.02.2019
comment
Привет, @lucaortis. Не зная характера вашего продукта, трудно сказать, подходит ли эта модель лицензии, но я хотел бы предупредить, что из всего программного обеспечения, которое пытается привязать себя к оборудованию, › 90% из них, вероятно, не должны этого делать. . Тем не менее, ваше решение выглядит хорошо, но помните, что MAC-адрес можно изменить ОЧЕНЬ легко, а данные SMBIOS (откуда берется UUID) можно установить вручную, если программное обеспечение запускается на виртуальной машине. Так что просто будьте осторожны — это будет работать, но более хрупко и менее безопасно, чем решение на основе входа в систему. - person user208769; 15.02.2019
comment
Спасибо за ваши советы. Я не эксперт, поэтому любой из них действительно полезен для меня. Мне удалось использовать только MAC-адрес, но по причине, которую вы объяснили, это вообще не лучший выбор. Я обязательно буду работать над этой системой, основанной на входе в систему. Кстати, в моем приложении уже есть система входа в систему, так как это почтовый клиент, и это заставляет меня задаться вопросом, как я могу присоединиться к системе входа в почту и моей системе входа. Извините за мой плохой английский тоже. - person lucaortis; 16.02.2019

Я решил, вызвав эти команды cmd из Ruby:

system('wmic nic get "MACAddress" |more >> mac.txt')
# >> Will print all MAC addresses inside "mac.txt" file

system('wmic csproduct get "UUID"')
# >> Will print an unique UUID

Возможно, есть способы получше, но я не эксперт, и это решило мою проблему.
У меня 64-разрядная версия Windows 10 Pro, и моя версия Ruby:

C:\>ruby -v
# >> ruby 2.3.3p222 (2016-11-21 revision 56859) [x64-mingw32]
person lucaortis    schedule 14.02.2019
comment
Вы можете использовать обратные кавычки вместо системы - например. a = `wmic nic ...` - Кроме того, что делает его более эффективным? - person user208769; 15.02.2019
comment
Здравствуйте, @ user208769, на самом деле у меня есть приложение с графическим интерфейсом, созданное с помощью библиотеки tcl/tk, когда я вызываю команды оболочки с помощью system, exec или также обратных стиков, я получаю раздражающее всплывающее окно cmd. Поэтому я вынужден использовать библиотеку win32ole, здесь я использовал system, чтобы было понятнее. |more обеспечит правильное декодирование вашего вывода, поскольку вызов wmic напечатает вывод с другой кодировкой. - person lucaortis; 16.02.2019