Внедрение проверки лицензии с помощью RSA

Я собираюсь продать программу, которую написал на C#, и хочу строго контролировать ее лицензии. Это означает, что я хочу, чтобы клиент подключался к моему серверу каждый раз, когда он запускается. Это также дает мне возможность отключать ключи (на случай возвратных платежей в PayPal или распространения кода). Конечно, это может быть проблемой для других пользователей, но в данном случае это необходимо. Поскольку мне не удалось найти хороших систем лицензирования .NET, которые не были бы взломаны, я решил попробовать написать небольшую систему самостоятельно. Мой план состоял в том, чтобы сделать следующее:

  1. Сгенерируйте key.dat, содержащий 1024 символа, который поставляется с программным обеспечением (индивидуально для каждого пользователя).
  2. В точке входа приложения добавьте httprequest на мой сервер, который отправляет key.dat + текущую временную метку в зашифрованном виде.
  3. Мой HTTP-сервер (под управлением PHP) расшифровывает запрос и проверяет, действителен ли ключ (в моей базе данных), и отвечает «уровнем доступа» (тип лицензии). Если ключ недействителен или отключен, он отвечает кодом ошибки. Как и в случае с запросом, ответ сопровождается отметкой времени, поэтому кто-то не может проверить свою программу, отправив себе действительный пакет. Отметка времени проверяется в клиенте. Ответ шифруется с помощью RSA и ранее сгенерированного открытого ключа.
  4. Клиент получает ответ, расшифровывает с помощью закрытого ключа и реагирует.

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


person Patrick Glandien    schedule 28.09.2009    source источник
comment
Вы имеете в виду, что ни у кого больше нет ЧАСТНОГО ключа, а не Открытого ключа. Публичные ключи по определению являются ПУБЛИЧНЫМИ.   -  person abelenky    schedule 28.09.2009
comment
Да, я тоже так думал, но каким-то образом каждое место, на которое я сейчас смотрел, определяло его наоборот, поэтому я был сбит с толку. Это правильно, что я единственный, у кого есть закрытый ключ, и я бы раздал открытый ключ (для расшифровки) с клиентом, да?   -  person Patrick Glandien    schedule 28.09.2009
comment
Вы единственный, у кого есть свой закрытый ключ, да. Вы распространяете свой открытый ключ по двум причинам: 1.) Чтобы другие могли зашифровать сообщения, которые можете прочитать только вы. 2.) Чтобы другие могли проверять сообщения, подписанные вашим закрытым ключом. Обратите внимание, что каждому объекту (отдельному программному обеспечению или центральному серверу) нужна собственная пара открытого/закрытого ключа.   -  person abelenky    schedule 28.09.2009
comment
Я зарежу любого, кто предложит использовать ключи безопасности. Считайте себя предупрежденными.   -  person Pesto    schedule 28.09.2009
comment
Но ключи - единственно верное решение. Предпочтительно использовать специальный USB-концентратор с несколькими ключами. Просто чтобы быть уверенным.   -  person Henk Holterman    schedule 28.09.2009


Ответы (2)


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

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

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


ИЗМЕНИТЬ

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

Теперь это может не относиться к приложению, которое вы собираетесь написать, но вам следует подумать о написании веб-приложения, приложения Flash или Silverlight вместо обычного клиентского приложения. Таким образом, вам не нужно распространять код среди клиентов. Все, что вам нужно сделать, это управлять учетными данными в приложении, что должно быть намного проще, чем ваша круговая система RSA.

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

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

person Welbog    schedule 28.09.2009
comment
Спасибо, но это именно тот ответ, который я не искал, я знаю, что вы мне говорите, и я понимаю эту философию. Мое программное обеспечение не для миллионов, и у него будет всего около 200 покупателей. Я не пытаюсь предотвратить его взлом вообще, но я хочу сделать его сложнее, ради собственного заработка. Аудитория, которой я продаю, не оценивает, стоит ли покупать это, если они могут получить это бесплатно. - person Patrick Glandien; 28.09.2009
comment
@Patrick: Если ваша потенциальная пользовательская база составляет 200 человек, зачем вам тратить время и деньги на реализацию этого? В этом практически нет смысла для бизнеса. - person GEOCHET; 28.09.2009
comment
Я мог бы рассмотреть возможность использования этого для большего количества моего программного обеспечения. Шифрование — это не совсем ракетостроение. Как уже было сказано, если вы можете предложить мне бесплатное и невзломанное программное обеспечение для лицензирования .net, я с благодарностью приму его. - person Patrick Glandien; 28.09.2009
comment
Вы правы, это не ракетостроение. Ракетостроение проще и лучше понимается. - person erickson; 28.09.2009
comment
Это лучший ответ. Это ужасная идея — заставлять клиента подключаться к вашему серверу только для проверки лицензии. Поцелуйте своих клиентов на прощание в первый раз, когда это доставляет им неудобства. Вы не можете поддерживать 100% время безотказной работы, поэтому ваше приложение не может. - person GEOCHET; 28.09.2009
comment
Шифрование имеет некоторое отношение к ракетостроению. Ракетная наука проста и легка, как и использование стандартного алгоритма шифрования. Ракетная инженерия действительно сложна и сложна, точно так же, как написание безопасного приложения с использованием шифрования. - person David Thornley; 28.09.2009

Подходит ли для этого RSA?

Я не думаю, что RSA - ваш лучший выбор.

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

Я не вижу, чтобы это применимо к вашему случаю. Ваше программное обеспечение хорошо знает ваш сервер. Они не «чужие».

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


Изменить После рассмотрения комментариев и других ответов.

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

Реальный вопрос: делает ли нарушение одной лицензии все лицензии уязвимыми/бесполезными. В обоих случаях (RSA и секретный ключ) ответ — нет. Только потому, что одна копия программного обеспечения была взломана и ее ключ был раскрыт, или система лицензий была обойдена, другие копии больше не подвергаются воздействию. PKE и SSE кажутся мне равными в этом отношении.

Поскольку общий секретный ключ легче реализовать и выполнить быстрее в вычислительном отношении, я думаю, что в данном случае он предпочтительнее, чем RSA/PKE. Это не значит, что RSA «неправильный». Он сделает то, что вам нужно, в той же степени, что и SSE (ни больше, ни меньше). Но я думаю, что SSE - более разумный выбор.

person abelenky    schedule 28.09.2009
comment
Не возникнет ли при шифровании с общим ключом проблемы, связанной с тем, что клиент будет хранить тот же ключ, который сервер использует для шифрования пакета? Это главное, чего я пытаюсь избежать, потому что таким образом кто-то, кто попытается взломать программное обеспечение, может легко создать эти пакеты самостоятельно. - person Patrick Glandien; 28.09.2009
comment
Хм..... хорошее замечание. Теперь я думаю, что могу ошибаться. Я остановлюсь на этом еще несколько минут, а затем рассмотрю возможность удаления моего ответа. - person abelenky; 28.09.2009
comment
В любом случае применяется одна и та же атака. Любой может победить ваше программное обеспечение, заменив встроенный в него ключ, будь то секретный (симметричный), общедоступный (для проверки лицензии, подписанной вашим сервером) или закрытый (для расшифровки лицензии с вашего сервера). Абеленький не виноват, что ты просил невозможного. - person erickson; 28.09.2009
comment
Я прошу безопасный протокол. Защитить программное обеспечение от модификации, безусловно, невозможно, но с помощью обфускации это можно сделать довольно сложно. Опять же, я не прошу решения, которое сделает мою программу невзламываемой. - person Patrick Glandien; 28.09.2009
comment
Я прошу безопасный протокол. - Разве мы не все? - person GEOCHET; 28.09.2009
comment
Симметричные алгоритмы могут обеспечить целостность и услуги аутентификации (доказать, что сообщение пришло от кого-то, кто знает секрет, и не было изменено), а также асимметричное шифрование. Трудность с симметричными алгоритмами заключается в безопасном обмене ключами. У выделенного клиента нет этой трудности. Единственная проблема, как вы уже поняли, заключается в том, что вы даете ключи злоумышленнику и надеетесь, что ваша запутанность достаточна для того, чтобы обнаружение не стоило попыток. - person erickson; 28.09.2009
comment
Если бы такой защищенный протокол существовал, все бы его использовало, и его бы уже взломали. То, о чем вы просите, — это не что иное, как безопасность через неизвестность, что вовсе не является безопасностью. - person Welbog; 28.09.2009
comment
@erickson: ОП не должен (и не должен) выдавать мастер-ключи в клиентском программном обеспечении. Вместо этого каждый клиент должен иметь уникальный общий секрет с сервером. Если какой-либо клиент откажется от своего секретного ключа, все остальные клиенты будут так же защищены. - person abelenky; 28.09.2009
comment
Согласен, если используется симметричная крипта, у каждого клиента должен быть свой ключ. Я пытался сказать, что общий ключ должен быть встроен в клиент при его распространении. Чтобы клиент мог безопасно получить ключ во время выполнения, он должен выполнить соглашение о ключе. Хотя было бы сложно встраивать разные ключи в каждую копию клиента, это возможно, и это было сделано другим программным обеспечением. В этом отношении может быть проще использовать шифрование с открытым ключом, когда каждый клиент имеет один и тот же открытый ключ (используемый для проверки подписи лицензии), и вы надеетесь, что пользователь не заменит его. - person erickson; 29.09.2009