Плюсы / минусы сборок со строгими именами и подписью

У нас есть решение, в котором много проектов (возможно, 20 и более). Недавно мы внесли некоторые изменения, которые требуют, чтобы пара этих сборок могла быть вызвана из COM, а это значит, что нам нужно присвоить им строгие имена. Эти сборки ссылаются на другие в нашем проекте, что означает, что они также должны иметь строгие имена. У них также есть атрибуты InternalsVisibleTo, поэтому предоставленные сборки также должны иметь строгие имена.

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

Плюсы

  • Требуется вызвать сборку из COM
  • Это позволило бы нам поместить сборки в GAC (сейчас мы этого не делаем)
  • Это предотвращает взлом (мы размещаем приложение, оно не установлено на клиентских сайтах, так что это не такая уж большая проблема)

Минусы

  • Это требует, чтобы каждая сборка, которую мы используем в будущем, была подписана

У меня два конкретных вопроса:

  1. Вы бы сказали, что в целом неплохо подписывать / строго именовать сборки?
  2. Можете ли вы назвать другие плюсы или минусы?

person Craig W.    schedule 07.04.2011    source источник
comment
Откуда взялась идея, что теперь все должно быть подписано? Виральны неподписанные сборки: нельзя ссылаться на неподписанную сборку из подписанной сборки. Однако вы можете сделать наоборот. Те, которые должны быть подписаны, вызваны причинами, которые вы указали в первом абзаце.   -  person R. Martinho Fernandes    schedule 07.04.2011
comment
Кстати: это не перестает вмешиваться. Вы можете удалить серийный номер и изменить ссылочные сборки, и все готово. Я сделал это в качестве доказательства концепции коммерческого программного обеспечения с использованием Reflector и Reflexil.   -  person kͩeͣmͮpͥ ͩ    schedule 07.04.2011
comment
@David: и вы даже можете сделать это с помощью только ilasm и ildasm. @ Future Дэвид: спасибо, я поменял порядок подписанный / неподписанный.   -  person R. Martinho Fernandes    schedule 07.04.2011
comment
@Martino Я думаю, вы запутались в последней части - вы не можете ссылаться на неподписанную сборку из подписанной сборки, но вы можете ссылаться на подписанную сборку из неподписанной сборки.   -  person kͩeͣmͮpͥ ͩ    schedule 07.04.2011
comment
Я никогда не говорил, что все в нашем решении должно быть подписано. Моя точка зрения заключалась в том, что вместо того, чтобы искать и клевать, чтобы выяснить, какие из них нужно подписать, было бы проще просто подписать их все. Это также позволит избежать проблем в будущем, когда разработчик установит ссылку из подписанного проекта на неподписанный проект, и внезапно решение не будет компилироваться, потому что теперь мы должны подписать этот недавно упомянутый проект и выследить все, что в нем ссылки, чтобы убедиться, что они подписаны.   -  person Craig W.    schedule 07.04.2011


Ответы (3)


Ваш единственный обман - подделка. На самом деле это профи.

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

person R. Martinho Fernandes    schedule 07.04.2011
comment
Я думаю, что это тоже профессионал, но, если быть объективным, это означает, что любое программное обеспечение, которое мы приносим в организацию отныне собственного (коммерческое, с открытым исходным кодом, условно-бесплатное ПО и т. Д.), Должно иметь подписанную версию или < / i> мы должны иметь возможность создать подписанную версию с нашим собственным snk. Думаю, с точки зрения бизнеса это можно было бы считать мошенничеством. - person Craig W.; 07.04.2011
comment
@Craig: Это верная точка зрения. Я думал об идеальной ситуации с ответственными поставщиками :(. Печально, что не каждый, кто делает многоразовое программное обеспечение, подписывает то, что они выпускают, даже не задумываясь об этом: это единственный способ сделать всех ваших клиентов счастливыми. - person R. Martinho Fernandes; 08.04.2011

«Требуется вызвать сборку из COM»

Вам не нужно подписывать сборку, чтобы сделать ее COM-компонентом. Я реализовал много COM-серверов без подписи сборки.

еще несколько минусов:

  • вы не можете обновить сборку новой версией без замены всех других сборок, требующих этого => легко не использовать общие компоненты
  • не может использовать не подписанные сторонние компоненты (многие Free / OpenSource)
  • подписанные сборки в GAC не проверяются, кто-то злой может изменить / заменить вашу подписанную сборку чем угодно, и ваши программы с радостью примут это что угодно ссылка
person Firo    schedule 02.12.2011
comment
вы не можете обновить сборку новой версией, не заменив все остальные сборки, требующие этого = ›легко отсутствуют общие компоненты. Не верно. Вы должны добавить в свою конфигурацию строку для перенаправления привязки. Это все еще может быть мошенничеством, но не настолько катастрофическим. - person jbtule; 18.09.2013
comment
вы должны добавить его в каждое приложение, которое использует компонент. Это непросто, если у вас есть компонент app- ›module-› и вы обновляете компонент, тогда приложение должно добавить перенаправление для компонента, о котором оно даже не знает. Распространенный сценарий для служебных dll, встроенных в модули - person Firo; 19.09.2013
comment
вы не можете обновить сборку новой версией без замены всех других сборок, требующих этого, вы должны сообщить об этом Microsoft, потому что они делают это уже давно. - person Voo; 03.03.2017
comment
@Voo Вы можете изменить файл только в том случае, если он имеет ту же версию и открытый ключ. Я получил удовольствие от развития библиотек с одной и той же версией, потому что зависимые сборки больше не загружали их. Таким образом MS отправляет только внутренние исправления ошибок. - person Firo; 07.03.2017
comment
и изменение mashine.config для перенаправления на более новые версии вызывает проблемы. - person Firo; 07.03.2017
comment
@ Firo Совершенно верно. Теперь просто подумайте о том, что программа, скомпилированная для System.dll .NET 4.0, будет отлично работать на .NET 4.6. Хитрость заключается в том, чтобы обновлять версию сборки только в том случае, если вы вносите критические изменения, вы все равно можете обновить версию файла, чтобы иметь возможность различать разные версии. Вуаля, вы можете без проблем создавать новые версии, так же как и без подписи, и вы должны иметь дополнительное преимущество, заключающееся в возможности убедиться, что кто-то не использует фактически несовместимую двоичную версию новой версии. - person Voo; 07.03.2017
comment
Вы можете выбрать для неподписанных сборок конкретные или неспецифические версии. С подписью вы можете использовать только определенные версии. Если только версия файла когда-либо увеличивается для дополнений, но не нарушает изменения, это та же проблема, что и у меня, MethodNotFoundException во время выполнения. - person Firo; 07.03.2017
comment
@Firo Причина обновления версии сборки состоит в том, чтобы убедиться, что несовместимая версия dll приводит к ошибкам немедленно, а не где-то неожиданно с потенциальными проблемами повреждения данных. Существуют также обратно несовместимые изменения, которые являются двоичными (например, изменение значения параметра), которые невозможно отловить с помощью неподписанных сборок. Так что в целом неправильно, что вы не можете выпускать новые версии (.NET framework это прекрасно демонстрирует), и есть возможные дополнительные функции, которые вы можете использовать, если хотите. - person Voo; 07.03.2017
comment
Также ваша злая ссылка злоумышленника требует, чтобы злоумышленник уже имел права администратора. Если первый шаг вашего злобного эксплойта требует получения прав администратора, это не эксплойт, это социальная инженерия, и на самом деле нет никакого технического решения для этого. - person Voo; 07.03.2017
comment
Предполагая, что Desktop-Apps: изменение dll в папке с программой также требует прав администратора. Никакой разницы между подписанными и неподписанными dll с точки зрения безопасности. - person Firo; 14.03.2017

  • ClickOnce требует, чтобы ваши сборки были подписаны.
  • Многие проекты с открытым исходным кодом не распространяют подписанные сборки, и их часто нетривиально скомпилировать с вашим собственным SNK.
person kͩeͣmͮpͥ ͩ    schedule 07.04.2011
comment
Объединено в 1 ответ. Спасибо за отзывы сообщества по этому поводу. - person kͩeͣmͮpͥ ͩ; 07.04.2011
comment
+1 за упоминание не подписанных раздач. Это хлопотно, когда вам нужно установить что-то только для того, чтобы вы могли запустить скрипт сборки проекта с открытым исходным кодом, потому что разработчики услышали некоторый FUD о подписании сборок и испугались. - person R. Martinho Fernandes; 07.04.2011
comment
Мы рассмотрели проблему с открытым исходным кодом. Наша компания неохотно внедряет решения с открытым исходным кодом, и те немногие, которые мы используем, либо предоставляли подписанную сборку, либо были очень просты для создания подписанной версии. - person Craig W.; 07.04.2011