C #: навіщо підписувати збори?


146

У якомусь коді C #, який я взяв (у Visual Studio 2005), я помітив, що всі збірки підписані одним .snkфайлом.

  • Чому попередній автор таким чином підписав збори?
  • Чи потрібне підписання асамблей і що було б не з підписом?
  • Які недоліки є у підписання зборів - це спричиняє затримки?

Відповіді:


186

Чому попередній автор таким чином підписав збори?

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

Чи потрібне підписання асамблей і що було б не з його підписанням?

Ні, це не обов'язково, але це механізм, що дозволяє вам забезпечити справжність збірки. Це дозволяє переконатися, що збірка не була підроблена і вона походить від цього автора. Це також необхідно, якщо ви хочете помістити їх у GAC.

Які недоліки є у підписання зборів - це спричиняє затримки?

Підписані збори можуть завантажувати лише інші підписані збори. Крім того, вони прив’язані до певної версії, що означає, що вам потрібно використовувати перенаправлення прив’язки або перекомпілювати додаток, якщо ви хочете використовувати іншу версію. Невеликі результати роботи також пов'язані з підтвердженням підпису, але це так мало, що вас не повинно турбувати.


2
Зауважте, що перевірка підписів більше не проводиться (починаючи з .NET 2.0) при розміщенні в GAC; це відбувається лише один раз, додаючи його в GAC .
Авель

1
Що ви думаєте про його підписання сьогодні? На веб-системах? Якщо я маю рацію, це було потрібно лише тоді, коли говорили про встановлені програмні засоби, правда? Якщо я публікую свою програму в Azure за допомогою TFS, я знаю, що вона не була підроблена, правда? Або я пропускаю якусь частину безпеки?
Рік Волф

Перше запитання: він створив шаблон проекту з проекту, який мав файл ключа підписи асемблера, потім він використав цей шаблон проекту для створення іншого матеріалу і забув замінити файл ключа. (просто замініть "він" на "я", і ви знаєте, що я робив сьогодні вранці :)). Отже, це випадково.
hardyVeles

33

Вам потрібно підписати збірки, якщо ви хочете помістити їх у GAC .

Якщо ви підписуєте виконуваний файл, то будь-які бібліотеки класів, на які він посилається, також повинні бути підписані. Це може бути складно, якщо ви використовуєте сторонні бібліотеки (особливо якщо вам потрібно використовувати елемент управління ActiveX або подібне).

Річард Грімс написав хороший семінар з питань безпеки в .NET, який включає в себе розділ про це: Семінар з безпеки

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


17

Дуже важлива причина підписання зборів - це ви можете бути впевнені, що це ваша збірка. Оскільки приватний ключ ваш, ніхто більше не може підписати збірку з цим самим ключем. Це означає, що коли відкритий ключ збірки - це той, кого ви знаєте (ви можете отримати це за допомогою GetType().Assembly.GetName().GetPublicKey()функції), збірка є вашою, і вона не була підроблена.


1

Незважаючи на всі звичаї підписання dll, dll слід підписувати лише з двох причин

1. Версія

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

а. Версія позначає, на якій версії побудовано dll, і при натисканні на них у GAC два dll з тим самим іменем можуть існувати, але інша версія

б. Автентифікація позначає, чи DLL не підроблений і чи існує той самий, коли він був створений.

Якщо ви хочете дізнатися більше про основи та підписання dll, ви можете посилатися тут


1
Що ви думаєте про його підписання сьогодні? На веб-системах? Якщо я маю рацію, це було потрібно лише тоді, коли говорили про встановлені програмні засоби, правда? Якщо я публікую свою програму в Azure за допомогою TFS, я знаю, що вона не була підроблена, правда? Або я пропускаю якусь частину безпеки?
Рік Волф

1
Я не бачу причини, чому ми повинні підписати dll зараз на дні, яка буде розгорнута як рішення Paas в лазурі. Але якщо у вас є рішення iaas, ви можете повторно використовувати dll веб-додатком у тому самому iis. Що я не рекомендую. ми повинні називати їх через api url, а не використовувати ті DLL від GAC (мікросервісна архітектура).
Картікеян ВК

1

На додаток до існуючих відповідей, я хотів би додати, що ви повинні використовувати підпис, коли ваша DLL буде динамічно завантажена та споживана стороннім програмним забезпеченням. Сама по собі не є технічною вимогою, але є раціональною, тому дуже поширеною, щоб сторонній виробник програмного забезпечення здійснював таку політику з огляду на безпеку.

Приклади, коли потрібно підписати збірку:

  • розробка розширення Windows Shell / Windows Explorer, наприклад: розширення контекстного меню для Windows Explorer
  • розробка розширень Visual Studio, таких як: Майстер шаблонів проектів / предметів GUI

0

Підписання та складання важливо. Для того, щоб переконатися, що exe або збірка встановлена ​​лише на цьому ПК.

Т.е.: якщо ви скопіюєте цю папку і помістите в інший ПК, вона не працює. оскільки він підписує цю збірку лише на цій машині.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.