106
Глава.3 .Совместно.используемые.сборки.и.сборки.со.строгим.именем
Устойчивость сборок со строгими именами
к несанкционированной модификации
Подписание файла закрытым ключом и внедрение подписи и открытого ключа
в сборку позволяет CLR убедиться в том, что сборка не была модифицирована или
повреждена. При установке сборки в GAC система хеширует содержимое файла
с манифестом и сравнивает полученное значение с цифровой подписью RSA,
встроенной в PE-файл (после извлечения подписи с помощью открытого ключа).
Идентичность значений означает, что содержимое файла не было модифицировано.
Кроме того, система хеширует содержимое других файлов сборки и сравнивает по-
лученные значения с таковыми из таблицы манифеста
FileDef
. Если хоть одно из
значений не совпадает, значит хотя бы один из файлов сборки был модифицирован
и попытка установки сборки в каталог GAC окончится неудачей.
Когда приложению требуется привязка к сборке, на которую оно ссылается, CLR
использует для поиска этой сборки в GAC ее свойства (имя, версию, региональные
стандарты и открытый ключ). Если нужная сборка обнаруживается, возвращается
путь к каталогу, в котором она находится, и загружается файл с ее манифестом.
Такой механизм поиска сборок гарантирует вызывающей стороне, что во время
выполнения будет загружена сборка издателя, создавшего ту сборку, с которой
компилировалась программа. Такая гарантия возможна благодаря соответствию
маркера открытого ключа, хранящегося в таблице
AssemblyRef
ссылающейся
сборки, открытому ключу из таблицы
AssemblyDef
сборки, на которую ссылают-
ся. Если вызываемой сборки нет в GAC, CLR сначала ищет ее в базовом каталоге
приложения, затем проверяет все закрытые пути, указанные в конфигурационном
файле приложения; потом, если приложение установлено при помощи MSI, CLR
просит MSI найти нужную сборку. Если ни в одном из этих вариантов сборка не
находится, привязка заканчивается неудачей и выдается исключение
System.
IO.FileNotFoundException
.
ПриМеЧание
Когда.сборка.со.строгим.именем.загружается.из.каталога.GAC,.система.гарантирует,.
что.файлы,.содержащие.манифест,.не.подверглись.несанкционированной.модифи-
кации .Эта.проверка.происходит.только.один.раз.на.этапе.установки .Для.улучшения.
производительности.среда.CLR.не.проверяет,.были.ли.файлы.несанкционированно.
модифицированы,.и.загружает.их.в.домен.приложений.с.полными.правами .В.то.же.
время,.когда.сборка.со.строгим.именем.загружается.не.из.каталога.GAC,.среда.CLR.
проверяет.файл.манифеста.сборки.дабы.удостовериться.в.том,.что.он.устойчив.к.
несанкционированной.модификации,.занимая.дополнительное.время.для.проверки.
каждый.раз.во.время.загрузки.этого.файла
При загрузке сборки со строгим именем не из GAC, а из другого каталога
(базового каталога приложения или каталога, заданного элементом
codeBase
107
Отложенное.подписание
в конфигурационном файле) CLR проверяет ее хеш-коды. Иначе говоря, в данном
случае хеширование файла выполняется при каждом запуске приложения. При
этом быстродействие несколько снижается, но можно гарантировать, что содер-
жимое сборки не подверглось несанкционированной модификации. Обнаружив
во время выполнения несоответствие хеш-кодов, CLR выдает исключение
System.
IO.FileLoadException
.
Do'stlaringiz bilan baham: |