С#: зачем подписывать сборку?

В некотором коде С#, который я взял (в Visual Studio 2005), я заметил, что сборки все подписаны с тем же файлом .snk.

  • Почему предыдущий автор подписал сборки таким образом?
  • Требуется ли сбор подписей и что было бы неправильно с не подписанием?
  • Какие недостатки существуют в подписание сборок - это вызывает задержки?

Ответ 1

Почему предыдущий автор подписал сборки таким образом?

Не знаю, может, он хотел, чтобы все его сборки были подписаны с тем же ключом.

Требуется ли сборка сборок и что было бы неправильно с ее не подписывать?

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

Какие недостатки существуют при подписании сборок - это вызывает задержки?

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

Ответ 2

Вам нужно подписать сборки, если вы хотите поместить их в GAC.

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

Ричард Граймс написал хороший семинар о безопасности в .NET и включает в себя главу об этом: Семинар по безопасности

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

Ответ 3

Очень важная причина для подписи сборки - значит, вы можете быть уверены, что это ваша сборка. Поскольку закрытый ключ принадлежит вам, никто другой не может подписывать сборку с тем же ключом. Это означает, что, когда открытый ключ сборки - это тот, который вы знаете (вы можете получить это с помощью функции GetType().Assembly.GetName().GetPublicKey()), сборка принадлежит вам, и она не была изменена.

Ответ 4

Несмотря на все случаи подписания dll, DLL должна быть подписана только по двум причинам.

1. Версии

2. Аутентификация

а. Versioning обозначает версию, на которую была построена dll, и при нажатии на GAC две DLL с одинаковым именем могут существовать, но другая версия

б. Аутентификация означает, что DLL не подделана и существует, когда она была создана.

Если вы хотите больше узнать об основах и подписи dll, вы можете сослаться на здесь