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

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

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

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

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

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

Нет, это не обязательно, но это механизм, позволяющий вам гарантировать подлинность сборки. Это позволяет вам гарантировать, что 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, таких как: Мастер создания шаблонов проектов / элементов
  • Как объединить несколько сборок в один?
  • Visual Studio 2010: ссылочные сборки Ориентация на версию с более высокой версией
  • В чем разница между MOV и LEA?
  • Что регистрирует сохранение в соглашении вызова ARM C?
  • Maven: добавьте зависимость к банке относительным путем
  • Возможно ли «декомпилировать» Windows .exe? Или, по крайней мере, рассмотреть Ассамблею?
  • Самый быстрый способ вычисления 128-битного целого по модулю 64-разрядного целого числа
  • Как определить, была ли assembly .NET построена для x86 или x64?
  • _addcarry_u64 и _addcarryx_u64 с MSVC и ICC
  • Использование разных версий одной и той же сборки в одной папке
  • Visual Studio «Не удалось скопировать» ... во время сборки
  • Interesting Posts

    Список установленных в настоящее время нестабильных пакетов (Gentoo Linux)

    Как программно доказать, что StringBuilder не является streamобезопасным?

    Невозможно изменить настройки сетевого адаптера с помощью ethtool

    Как обрабатывать всплывающее окно загрузки файлов с помощью Selenium WebDriver?

    Каковы последствия установки installSecurityContext = «False», если я использую https?

    Как преобразовать шестнадцатеричную строку в шестнадцатеричный номер

    Узнайте, какие программы сильно используют сеть

    Как сравнивать CDI и EJB? взаимодействовать?

    AsyncTask, исключение ExjectException и ограничение задачи

    Разделить текстовую строку в столбцах data.table

    Показать вкладки в полноэкранном режиме Chrome?

    как я могу открыть календарь из своего приложения?

    Сохранить окно сверху и украсть фокус в WinForms

    Почему плохое качество отображения во всех PDF-чтениях, кроме Adobe?

    Проводник Windows сортирует файлы и папки отдельно

    Давайте будем гением компьютера.