Что такое токен открытого ключа и как он рассчитывается в строгих именах сборки?

Asked
Viewd23544

24

Что такое «токен открытого ключа» и как он рассчитывается в строгих именах сборки?

6 ответов

16

Что касается вашего вопроса "Как это вычисляется", это хеш SHA1.

Из блога dot net :

Microsoft решает "открытый ключ" раздувание "проблемы с использованием хеш-значения открытый ключ сборки со строгим именем. Эти хэши называются общедоступными. ключевые токены и младшие 8 байтов хэш SHA1 строго названного открытый ключ сборки. Хэши SHA1 160-битные (20 байтные) хеши, и верхний 12 байтов хэша просто отброшены в этом алгоритме.

0

Это хэш-байты ключа, используемого для подписи сборки.

Таким образом, вместо того, чтобы перечислять сотни шестнадцатеричных цифр для ключа, у вас есть что-то более простое, но все же с небольшим риском коллизий.

  • Fixed hash (thanks). Default key is 1024 or 512 bites, which would need 256 or 128 hex digits, which is (just :-)) hundreds.

    Richard21 февраля 2009, 16:49
  • Actually it’s a Hash from the key, not the tail bytes. And the real keys is dozens of bytes, not hundreds.

    Henk Holterman21 февраля 2009, 16:25
3

Маркер открытого ключа используется для идентификации организации в сборке со строгим именем. Эта информация добавляется в метабазу сборки. Я предполагаю, что Ричард прав насчет технического способа хранения.

Если вы хотите просмотреть метабазу сборки, используйте ILDASM. Вы можете углубиться в то, что хранится в метабазе, в дополнение к просмотру IL.

5

Из ECMA-335:

Это объявление используется для хранения младших 8 байтов хэша SHA-1 отправителя открытый ключ в ссылке на сборку, а не полный открытый ключ.
Ссылка на сборку может хранить либо полный открытый ключ, либо 8-байтовый «токен открытого ключа». Либо можно использовать для убедитесь, что тот же закрытый ключ, который использовался для подписи сборки во время компиляции, также подписал сборку, используемую в время выполнения. Присутствовать ни то, ни другое не требуется, и хотя оба могут быть сохранены, это бесполезно.

[Обоснование: открытый ключ или токен открытого ключа, хранящийся в ссылке на сборку, используется для гарантии того, что сборка, на которую ссылаются, и сборка, фактически используемая во время выполнения, были созданы сущностью, которой принадлежит одного и того же закрытого ключа, и поэтому можно предположить, что он был предназначен для той же цели. В то время как полный открытый ключ криптографически безопаснее, для него требуется больше места для хранения ссылки. Использование открытого ключа token уменьшает пространство, необходимое для хранения ссылки, лишь немного ослабляя процесс проверки. конец обоснования]

Что касается того, как вычисляется хэш (я предполагаю, что это может быть то, что вы спрашиваете, поскольку токен открытого ключа не "вычисляется"), из той же спецификации:

Метаданные интерфейса командной строки позволяют производителю сборки вычислить криптографический хэш этой сборки (используя хеш-функцию SHA-1), а затем зашифровать его с помощью алгоритма RSA (см. раздел I) и публичного / частного пара ключей по выбору производителя. Результаты этого («цифровая подпись SHA-1 / RSA») могут быть затем сохранены. в метаданных (§25.3.3) вместе с открытой частью пары ключей, требуемой алгоритмом RSA. В Директива .publickey используется для указания открытого ключа, который использовался для вычисления подписи. Вычислять хэш, подпись обнуляется, хеш вычисляется, а затем результат сохраняется в подписи.

В процессе подписания строгого имени (SN) используются стандартные алгоритмы хеширования и шифрования для подписания строгого имени. An Создается хэш SHA-1 для большей части PE-файла. Это хеш-значение подписано RSA с закрытым ключом SN. За В целях проверки открытый ключ сохраняется в PE-файле, а также подписанное хеш-значение.
За исключением следующего, все части PE-файла хешируются: • Запись Authenticode Signature: PE-файлы могут быть подписаны Authenticode. Аутентичный код подпись содержится в 8-байтовой записи по смещению 128 каталога данных заголовка PE («Таблица сертификатов» в §25.2.3.3) и содержимое PE-файла в диапазоне, указанном в этом запись в каталоге. [Примечание: в соответствующем PE-файле эта запись должна быть равна нулю. конец примечания] • Большой двоичный объект строгого имени: 8-байтовая запись по смещению 32 заголовка интерфейса командной строки («StrongNameSignature» в §25.3.3) и содержимое хэш-данных, содержащихся в этом RVA в PE-файле. Если 8-байтовый запись 0, связанная строчка отсутствуетng имя подпись. • Контрольная сумма PE-заголовка: 4-байтовая запись по смещению 64 PE-заголовка для Windows NT. Поля («Контрольная сумма файла» в §25.2.3.2). [Примечание: в соответствующем PE-файле эта запись должна быть равна нулю. конец примечания]

Спецификацию можно бесплатно скачать здесь: http: // www .ecma-international.org / публикации / стандарты / Ecma-335.htm