Подписание сборников .NET: действительно ли это защищает мою сборку от несанкционированного доступа?

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

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

  • Поскольку я не видел, чтобы CLR когда-либо говорила о недопустимости сигнатуры сборки, я хочу убедиться, что эта система действительно работает. Имеет ли это? Что делать, чтобы заставить его работать?
  • Может ли атакующий сосредоточить свои усилия на CLR, чтобы не заботиться о моей подписи? То есть, если он не может вмешиваться в мой код, потому что я его подписал, может ли он вмешаться в CLR?
  • Как правило, я хотел бы узнать ваш опыт в отношении таких безопасных и защитных технологий. Может ли кто-нибудь предложить что-нибудь еще?

Ответы

Ответ 1

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

Затем они смогут модифицировать код по своему усмотрению, поскольку клиент (exe) теперь ссылается на dll без знака (или "повторно подписанный" ).

Чтобы сделать процесс декомпиляции и перекомпиляции более сложным, вы можете попробовать создать смешанную сборку С++/CLI, содержащую как управляемый, так и собственный код. Но да... в конечном счете, люди имеют все ваши двоичные файлы, чтобы справиться и с достаточным усилием, возможно, обойду любую систему лицензирования, которую вы придумали.

Ответ 2

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

http://www.codeproject.com/KB/security/StrongNameExplained.aspx

Ответ 3

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

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

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

Ответ 4

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

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