раздел PE-файла (при хешировании PE-файла этот раздел исключается), и в
CLR-заголовок PE-файла записывается адрес, по которому встроенная цифровая
подпись находится в файле.
В этот PE-файл также встраивается открытый ключ издателя (он записывается
в таблицу
AssemblyDef
метаданных манифеста). Комбинация имени файла, версии
сборки, региональных стандартов и значения открытого ключа составляет строгое
имя сборки, которое гарантированно является уникальным. Две разных компании
ни при каких обстоятельствах не смогут создать две одинаковые сборки, скажем,
с именем
Calculus
, с той же парой ключей (без явной передачи ключей).
Теперь сборка и все ее файлы готовы к упаковке и распространению.
100
Глава.3 .Совместно.используемые.сборки.и.сборки.со.строгим.именем
рис. 3.1.
.Подписание.сборки
Как отмечено в главе 2, при компиляции исходного текста компилятор обна-
руживает все типы и члены, на которые ссылается исходный текст. Также ком-
пилятору необходимо указать все сборки, на которые ссылается данная сборка.
В случае компилятора C# для этого применяется параметр
/reference
. В задачу
компилятора входит внедрение таблицы метаданных
AssemblyRef
в результи-
рующий управляемый модуль. Каждая запись таблицы метаданных
AssemblyRef
описывает файл сборки, на которую ссылается данная сборка, и состоит из имени
файла сборки (без расширения), номера версии, регионального стандарта и значе-
ния открытого ключа.
ВниМание
Поскольку.значение.открытого.ключа.велико,.в.том.случае,.когда.сборка.ссылается.на.
множество.других.сборок,.значения.открытых.ключей.могут.занять.значительную.часть.
результирующего.файла .Для.экономии.места.в.компании.Microsoft.хешируют.откры-
тый.ключ.и.берут.последние.8.байт.полученного.хеш-кода .В.таблице.AssemblyRef.на.
самом.деле.хранятся.именно.такие.усеченные.значения.открытого.ключа.—.маркеры.
отрытого.ключа .В.общем.случае.разработчики.и.конечные.пользователи.намного.
чаще.встречаются.с.маркерами,.чем.с.полными.значениями.ключа
Вместе.с.тем.нужно.иметь.в.виду,.что.среда.CLR.никогда.не.использует.маркеры.от-
крытого.ключа.в.процессе.принятия.решений,.касающихся.безопасности.или.доверия,.
потому.что.одному.маркеру.может.соответствовать.несколько.открытых.ключей
Далее приведены метаданные таблицы
AssemblyRef
(полученные средствами
ILDasm exe
) для файла
MultiFileLibrary dll
, обсуждавшегося в главе 2:
101
Назначение.сборке.строгого.имени
AssemblyRef #1 (23000001)
Token: 0x23000001
Public Key or Token: b7 7a 5c 56 19 34 e0 89
Name: mscorlib
Version: 4.0.0.0
Major Version: 0x00000004
Minor Version: 0x00000000
Build Number: 0x00000000
Revision Number: 0x00000000
Locale:
HashValue Blob:
Flags: [none] (00000000)
Из этих сведений видно, что файл
MultiFileLibrary dll
ссылается на тип, располо-
женный в сборке со следующими атрибутами:
"MSCorLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
К сожалению, в утилите
ILDasm exe
используется термин
Locale
, хотя на самом
деле там должно быть слово
Culture
.
Взглянув на содержимое таблицы метаданных
AssemblyDef
файла
MultiFileLibrary
dll
, мы увидим следующее:
Assembly
------------------------------------
Token: 0x20000001
Name : MultiFileLibrary
Public Key :
Hash Algorithm : 0x00008004
Version: 3.0.0.0
Major Version: 0x00000003
Minor Version: 0x00000000
Build Number: 0x00000000
Revision Number: 0x00000000
Locale:
Flags : [none] (00000000)
Это эквивалентно следующей строке:
"MultiFileLibrary, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null"
Здесь открытый ключ не определен, поскольку сборка
MultiFileLibrary dll
, соз-
данная в главе 2, не была подписана открытым ключом и, следовательно, является
сборкой с нестрогим именем. Если бы я создал файл с ключами при помощи ути-
литы
SN exe
, а затем скомпилировал сборку с параметром
/keyfile
, то получилась
бы подписанная сборка. Если просмотреть метаданные полученной таким образом
сборки при помощи утилиты
ILDasm exe
, в соответствующей записи таблицы
AssemblyDef
обнаружится заполненное поле
Public Key
, говорящее о том, что это
сборка со строгим именем. Кстати, запись таблицы
AssemblyDef
всегда хранит пол-
ное значение открытого ключа, а не его маркер. Полный открытый ключ гарантирует
102
Do'stlaringiz bilan baham: |