C #: зачем подписывать сборку?
В некотором коде C #, который я принял (в Visual Studio 2005), я заметил, что все сборки подписаны с тем же файлом .snk
.
- Почему предыдущий автор подписал собрания таким образом?
- Требуется ли сбор подписей и что было бы неправильно с не подписанием?
- Какие недостатки существуют при подписании сборок – это вызывает задержки?
- Возможно ли одноуровневое многоязычное развертывание Windows Forms (ILMerge и спутниковые сборки / локализация)?
- Поиск всех пространств имен в сборке с использованием Reflection (DotNET)
- Безопасно ли читать конец конца буфера на одной странице на x86 и x64?
- Ошибка в построении gradleа после обновления Android Studio с log4j
- Эффективное умножение матрицы 4x4 (C vs assembly)
- Правильное изменение неопределенного поведения, если число больше ширины типа?
- Как использовать строки в emu8086
- Почему XCHG reg, reg 3 инструкции по микрооперации на современных архитектурах Intel?
- Как извлечь сборку из GAC?
- Медленная инструкция jmp
- Сколько циклов процессора требуется для каждой инструкции сборки?
- Как вы прокручиваете загруженные в настоящее время сборки?
- Определить версию сборки (CLR) сборки
Почему предыдущий автор подписал собрания таким образом?
Не знаю, может, он хотел, чтобы все его собрания были подписаны с тем же ключом.
Требуется ли сбор подписей и что было бы неправильно, если бы не подписывались?
Нет, это не обязательно, но это механизм, позволяющий вам гарантировать подлинность сборки. Это позволяет вам гарантировать, что assembly не была подделана, и действительно она исходит от этого автора. Это также необходимо, если вы хотите поместить их в GAC.
Какие недостатки существуют при подписании сборок – это вызывает задержки?
Подписанные сборки могут загружать только другие подписанные сборки. Также они привязаны к определенной версии, означающей, что вам нужно использовать переадресацию привязки или перекомпилировать приложение, если вы хотите использовать другую версию. Кроме того, из-за проверки подписи есть небольшие накладные расходы, но это настолько мало, что вас не беспокоит.
Вам нужно подписать сборки, если вы хотите поместить их в GAC .
Если вы подписываете исполняемый файл, то любые библиотеки classов, к которым он привязан, также должны быть подписаны. Это может быть сложно, если вы используете стороннюю библиотеку (особенно если вам нужно использовать элемент управления ActiveX или аналогичный).
Ричард Граймс написал хороший семинар о безопасности в .NET, и в нем есть глава об этом: Семинар по безопасности
Причиной для всех сборок, подписанных с тем же файлом .snk, может быть, если он использовал модульное тестирование с охватом кода. Чтобы обеспечить покрытие кода (по крайней мере, с инструментами, встроенными в тестовую версию Visual Studio 2005), и если сборки подписаны, вам нужно указать, какие файлы .snk используются для подписания, но я думаю, что вы можете укажите один файл .snk для всего решения, поэтому, если вы подписываете различные библиотеки classов с разными файлами .snk, вы можете только проверять охват кода на одном из них за раз.
Очень важная причина подписания сборки – значит, вы можете быть уверены, что это ваша assembly. Поскольку закрытый ключ принадлежит вам, никто другой не может подписывать сборку с тем же ключом. Это означает, что когда открытый ключ сборки является тем, который вы знаете (вы можете получить это с помощью функции GetType().Assembly.GetName().GetPublicKey()
), assembly принадлежит вам, и она не была изменена.
Несмотря на все случаи подписания dll, DLL должна быть подписана только по двум причинам
1. Версии
2. Аутентификация
а. Versioning обозначает версию, на которую была построена dll, и при нажатии на GAC две DLL с таким же именем могут существовать, но другая версия
б. Аутентификация означает, что dll не подделано и существует, когда он был создан.
Если вы хотите больше узнать об основах и подписи dll, вы можете обратиться сюда
В дополнение к существующим ответам я бы добавил, что вы должны использовать подпись, когда ваша DLL будет динамически загружаться и потребляться сторонним программным обеспечением. Это не техническое требование как таковое, но разумно, поэтому очень распространено, что сторонний производитель программного обеспечения применяет такую политику из соображений безопасности.
Примеры, где вы должны подписать сборку:
- разработка расширения Windows Shell / Windows Explorer, например: расширение контекстного меню для Windows Explorer
- разработка расширений Visual Studio, таких как: Мастер создания шаблонов проектов / элементов