Как лучше всего управлять ключами продукта для библиотек кода?

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

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

Здесь есть две подзадачи:

  • Переход от пробной версии к полной. Я думаю решить эту проблему с помощью обновлений MSI, но не уверен, как этого можно достичь. (используя WIX)
  • Создание пробной сборки, включающей дополнительный код для проверки того, является ли это пробной версией. Я знаю, что это возможно с помощью операторов #if, но мне интересно, возможно ли также изменить DLL, точнее: добавить статические конструкторы для каждого типа, которые проверяют пробную версию.

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

обновить

Спасибо за все отличные ответы. Я думаю, пришло время объяснить больше контекста, исходя из ответов - к счастью, кажется, что мы более или менее на правильном пути.

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

Как было предложено в одном из ответов, в настоящее время я создаю несколько файлов MSI: один для x64 и один для x86. А затем один для пробной версии, полной версии и версии для чертежей. Всего получается 6 файлов MSI (pfff). Во время обфускации процесса происходит строгое именование и подпись кода. Версия проекта включает в себя полный исходный код.

Меня больше беспокоят пробные сборки. Конечно, я могу добавить некоторые проверки здесь и там, но я бы предпочел просто автоматически ставить проверки в каждом классе... Я подумал о том, чтобы скопировать все файлы CS и добавить/изменить статические c'tors (например, используя cecil или nrefactory.. или просто пару регулярных выражений...). Просто мне кажется, что я не единственный парень, который хочет этого. Должен быть лучший способ, верно?

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


person atlaste    schedule 04.02.2013    source источник


Ответы (4)


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

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

  • Обфускайте свой код с помощью лучшего обфускатора, который вы можете купить.
  • Распределите проверки валидности подписи в нескольких ключевых местах вашего кода, не проверяйте только один раз при запуске.
  • Узнайте об API-интерфейсах шифрования .NET, таких как асимметричное шифрование и подписи
  • Имейте в виду, что сгенерированные ключи продукта могут быть подвергнуты обратному проектированию, что в основном является проблемой, если ваше приложение имеет большой объем или большую ценность.

Сценарий с активацией:

При установке или в течение некоторого времени после нее вы можете потребовать от пользователей «Активировать» ваш продукт. При активации вы можете сгенерировать незашифрованный XML-файл с некоторыми компонентами, идентифицирующими систему - идентификатор ЦП, идентификатор жесткого диска, доменное имя, имя пользователя и т. д. Отправьте указанный XML на свой веб-сервис.

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

Ваше клиентское программное обеспечение будет иметь соответствующий встроенный открытый ключ и будет хранить случайный тег и подпись локально.

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

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

Сценарий без активации:

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

Включите случайный тег и хешируйте все данные вместе. Подпишите хэш и сохраните его в файле.

Пользователь должен будет сохранить файл в заранее определенном месте или вставить его в текстовое поле в вашем приложении.

person Sten Petrov    schedule 04.02.2013
comment
Спасибо, у вас есть интересные маркеры. Я добавил в свой вопрос больше бизнес-контекста, чтобы дать вам немного больше понимания ситуации. Кажется, ваш ответ совпадает с тем, что я работал, но я все еще борюсь с пробной версией и различными версиями установщика (вам действительно не нужна пробная и полная версия в системе :-)). - person atlaste; 05.02.2013
comment
Несколько способов справиться с этим: (1) всего один установщик и сделать так, чтобы ваш код динамически проверял ключ, а если его там нет - переключиться на пробный UX - это может обременить пробных пользователей; (2) установить одинаковые все идентификаторы и целевые папки как в пробной, так и в полной программе установки, сделать полную программу установки всегда версией выше пробной - это хак, и его может быть сложно поддерживать в долгосрочной перспективе; (3) один установщик с динамическими правилами, что устанавливать - это сложно сделать правильно и поддерживать в течение длительного времени. Все подходы, которые я вижу, имеют проблемы, выбирай свой яд :) - person Sten Petrov; 05.02.2013
comment
Спасибо. После рассмотрения альтернатив добавление переменной сборки и добавление ручного кода «#if» показались лучшим способом создания пробного установщика. А так как яд - отстой... Я подумал о (4): обратной проверке предварительных условий/автоматическом удалении "меньших версий". С помощью WIX вы можете проверить, соблюдаются ли определенные (установленные) зависимости (и принять меры), поэтому вы, вероятно, также можете проверить, не ли они соблюдаются... это не должно быть слишком сложно, попробовать это в ближайшее время - по крайней мере, мне кажется, что это менее болезненно, чем то, что вы предлагаете ... В любом случае я определенно предпочитаю делать все правильно в долгосрочной перспективе. - person atlaste; 06.02.2013
comment
Почему предлагаемая система автоматически не подвержена атакам с выбранным открытым текстом? - person Eric Lippert; 13.02.2013
comment
@EricLippert, как вы предлагаете атаковать мою схему? - person Sten Petrov; 13.02.2013
comment
Назовите открытый текст токеном. (1) Отправленный токен на самом деле представляет собой захваченный зашифрованный текст, подписанный вашим открытым ключом. Ваша служба теперь является службой расшифровки захваченных зашифрованных сообщений. (2) Злоумышленник отправляет сервису специально созданный токен1 и получает подписанный токен1. Из этого злоумышленник может сделать вывод, что служба сказала бы для токена2. Теперь подписанный и неподписанный token2 можно раздавать другим злоумышленникам, но сервис так и не увидел token2. Это всего лишь две распространенные атаки с выбранным открытым текстом; криптосистемы предполагают, что только владелец ключа использует закрытый ключ! - person Eric Lippert; 13.02.2013
comment
@EricLippert, вам нужно обновить криптографию с открытым ключом. Знание значений token1 и RSASign(token1, privateKey) НЕ позволяет вам вывести значение RSASign(token2, privateKey) без самого privateKey. privateKey никогда не распространяется и держится в секрете на сервере активации, с чего вы взяли, что он является общим?? - person Sten Petrov; 13.02.2013
comment
@EricLippert, если RSA был взломан так, как вы предполагаете, у нас гораздо большие проблемы, чем некоторые эксплойты ключа активации (: - person Sten Petrov; 13.02.2013
comment
Это, безусловно, так! Если вы можете создать токен1, зная незашифрованный токен2, то информация, возвращаемая при шифровании токена1 с помощью закрытого ключа, позволит вам вывести зашифрованный токен2. Это стандартный вектор атаки, и хорошо известно, что RSA не устойчив к нему. Я думаю, что человек, которому нужно освежить свои знания об атаках RSA, — это вы. RSA безопасен только тогда, когда владелец закрытого ключа выбирает открытый текст. Он не был разработан для обеспечения безопасности перед лицом открытых текстов, выбранных злоумышленниками, и нет. - person Eric Lippert; 13.02.2013
comment
Начните с прочтения этой статьи. dtc.umn.edu/~odlyzko/doc/arch/ rsa.attack.pdf - person Eric Lippert; 13.02.2013
comment
@EricLippert спасибо за полезную информацию, я должен был помнить об этом. Но возникает вопрос: как бы вы реализовали лицензирование в (автономном) контексте, который я описываю? - person atlaste; 13.02.2013
comment
Я эксперт по дизайну языков программирования, а не по схемам лицензирования (или криптографии), поэтому я не рискнул бы дать ответ, выходящий за рамки моей области знаний. Я скептически отношусь к ценности схем лицензирования в целом: они кажутся мне высокотехнологичным решением правовой и социальной проблемы, а не технической проблемой. - person Eric Lippert; 13.02.2013
comment
@EricLippert +1, я прочитал статью, отличный источник новой информации, спасибо! Однако это не влияет на данную схему лицензирования. Схема основана на обфускации приложения. Если он не запутан, будут еще более простые хаки, такие как внедрение кода во время выполнения. Если он запутан, злоумышленник не имеет открытого ключа и не имеет доступа к сообщениям, которые не удалось расшифровать. Чтобы получить к ним доступ, злоумышленник должен деобфусцировать код, что означает, что он может вообще обойти активацию. - person Sten Petrov; 13.02.2013
comment
@EricLippert Принимая во внимание ваш вклад, схему можно укрепить, сначала запросив случайный токен с сервера лицензирования, который включен в устройство, и пользовательские данные, которые хешированы и подписаны. Таким образом, злоумышленник не мог выбрать свой открытый текст. - person Sten Petrov; 13.02.2013
comment
Верно; теперь вы столкнулись с чем-то, против чего гораздо сложнее организовать атаку открытым текстом. Если вам нужно получить информацию из ненадежного источника, то (1) сначала проверьте его, чтобы убедиться, что это попытка атаки; если это так, то не используйте безопасный режим, в противном случае (2) посолите его, (3) хэшируйте его и (4) используйте реализацию RSA, которая была настроена, чтобы быть более устойчивой к атакам с выбранным открытым текстом. Эшелонированная защита имеет ключевое значение. И если вы думаете, что обфускация не только замедляет злоумышленника на несколько минут, подумайте еще раз. Запирание автомобиля не защищает его от угона. - person Eric Lippert; 13.02.2013
comment
@EricLippert ничто не является безопасным на 100%, все сводится к соотношению затрат и выгод. Обфускация может значительно замедлить атакующего, и если польза не слишком велика, он, скорее всего, сдастся. Если ваше программное обеспечение стоит 100 долларов, и высококвалифицированному специалисту требуется 3 месяца, чтобы взломать его, ваши инвестиции будут оправданы - если ваше программное обеспечение имеет большой объем, вы, вероятно, можете позволить себе выпускать небольшие обновления каждые пару месяцев, каждый раз с новым ключом. . Если это не массовый хакер с таким навыком, вероятно, не будет заинтересован в том, чтобы тратить свое время впустую. - person Sten Petrov; 13.02.2013
comment
@StenPetrov Ничто не является безопасным на 100%, потому что в этом участвуют люди. Но с чисто технической точки зрения вы можете сделать систему на 100 % безопасной (например, OTP). И обфускация вам в этом не поможет. - person svick; 13.02.2013
comment
@EricLippert Я думаю, что ваши опасения по поводу выбранного открытого текста относятся только к учебнику RSA, который не следует использовать. Я очень сомневаюсь, что такая атака работает на RSA с правильным заполнением (PSS или даже старый PKCS1-v1_5). | Но даже если бы это было так, людей, которые могли бы взломать криптографию, гораздо меньше, чем тех, кто просто исправляет проверку лицензии. - person CodesInChaos; 14.02.2013
comment
Конечно, проще просто разобрать, добавить несколько ответвлений и снова собрать. Я также думал о проверке подписи кода при отправке обновления или полной блокировке пользователя... И хотя я согласен с Эриком в том, что это юридическая/социальная проблема, к сожалению, это касается и моей ипотеки... Уловка-22 в том, что я Я также являюсь экспертом по программному обеспечению и, таким образом, чувствую, что должен внести свой вклад вместо того, чтобы внедрять глупые схемы лицензирования и установки, но, с другой стороны, я также хочу накормить себя и свою жену. Итак, я буду прагматиком. Спасибо всем за подробные советы, особенно Стену и Эрику. - person atlaste; 19.02.2013

Попробуйте лицензирование Rhino (с открытым исходным кодом).

Привяжите сгенерированную лицензию к индивидуальной машине, используя уникальный идентификатор машины, такой как SID компьютера, серийный номер жесткого диска, идентификатор ЦП и т. д. Используйте плавающие лицензии и проверяйте доступность лицензии на сервере во время выполнения. Лицензирование Rhino предоставляет необходимую для этого инфраструктуру. Rhino Licensing также может включать пользовательские данные в файл лицензии, чтобы у вас была возможность легко хранить информацию о клиенте в файле лицензии. С учетом всего сказанного наличие схемы лицензирования в вашем приложении не означает, что вы в полной безопасности. Хакеры и взломщики пытаются перепроектировать код вашего приложения, чтобы увидеть, как осуществляется лицензирование, поэтому вам нужно изучить другие проблемы безопасности, и рекомендуется использовать инструмент запутывания, чтобы усложнить это для злоумышленников.

person Jakub Konecki    schedule 04.02.2013
comment
Спасибо! Хотя это не то, что я могу использовать в своем бизнес-контексте, это похоже на хорошее решение для работы с большинством лицензионных ключей. Наверняка что-нибудь запомню. - person atlaste; 06.02.2013

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

person simoncpu    schedule 04.02.2013
comment
Извините, но здесь это не вариант, потому что полная версия означает версию чертежа, например. включая исходный код. Я не слишком беспокоюсь о трещинах и т. д., но чувствую, что должен немного усложнить задачу. - person atlaste; 05.02.2013

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

person cSharp Noob    schedule 04.02.2013
comment
Да, хотя я ценю эту мысль, я определенно не этого хочу... возможно, мне потребуется менее 5 минут, чтобы взломать эту часть программного обеспечения... Конечно, нет ничего надежного. , но, по крайней мере, я действительно не хочу держать дверь открытой. Кроме того, я предоставляю исходный код в одной из версий, которую не так просто отключить. - person atlaste; 06.02.2013