Что такое "токен открытого ключа" и как он вычисляется в строковых именах сборки?
Что такое токен открытого ключа и как он вычисляется в строгих именах сборки?
Ответ 1
Что касается вашего вопроса "Как он рассчитан", это хэш SHA1.
Из dot net blog:
Microsoft решает "открытый ключ" bloat ", используя хэш открытый ключ общедоступной сборки. Эти хеши называются общедоступными и являются низкими 8 байтами хэш SHA1 сильно названного публичный ключ сборки. Хеши SHA1 160 бит (20 байт) хэшей, а верхняя 12 байтов хэша просто отбрасывается в этом алгоритме.
Ответ 2
Вы можете получить PublicKeyToken из командной строки VS, набрав:
sn –T DLLName.dll
Ответ 3
Если вам нужно создать токен открытого ключа на основе открытого открытого ключа, этот небольшой статический метод работает:
private static byte[] GetKeyTokenFromFullKey(byte[] fullKey)
{
SHA1CryptoServiceProvider csp = new SHA1CryptoServiceProvider();
byte[] hash = csp.ComputeHash(fullKey);
byte[] token = new byte[8];
for (int i = 0; i < 8; i++ )
token[i] = hash[hash.Length - (i+1)];
return token;
}
Ответ 4
Из ECMA-335:
Это объявление используется для хранения младших 8 байтов хэша SHA-1 отправителей открытый ключ в ссылке на сборку, а не полный открытый ключ.
Ссылка на сборку может хранить либо полный открытый ключ, либо 8-байтовый токен открытого ключа. Либо можно использовать подтвердите, что тот же закрытый ключ, используемый для подписи сборки во время компиляции, также подписывал сборку, используемую в во время выполнения. Также не требуется присутствовать, и хотя оба могут быть сохранены, это не полезно.[Обоснование: токен открытого ключа или открытого ключа, хранящийся в ссылке на сборку, используется для обеспечения того, чтобы сборка, и сборка, фактически используемая во время выполнения, была произведена во владении субъектом одного и того же частного ключа, и поэтому можно предположить, что они были предназначены для этой же цели. В то время полный открытый ключ криптографически безопасен, для этого требуется больше места для хранения. Использование открытого ключа токен уменьшает пространство, необходимое для хранения ссылки, лишь слегка ослабив процесс проверки. конечное обоснование]
Как вычисляется хэш (я предполагаю, что это может быть то, что вы просите, поскольку токен открытого ключа не "вычислен" ) из той же спецификации:
Метаданные CLI позволяют производителю сборки вычислить криптографический хэш этой сборки (используя хэш-функцию SHA-1), а затем для ее шифрования с использованием алгоритма RSA (см. раздел I) и публичного/частного выбор пары производителей. Результаты этого ( "цифровая подпись SHA-1/RSA" ) могут быть сохранены в метаданных (§25.3.3) вместе с открытой частью пары ключей, требуемой алгоритмом RSA..publickey directive используется для указания открытого ключа, который использовался для вычисления подписи. Вычислять хэш, подпись обнуляется, вычисляется хэш, а затем результат сохраняется в сигнатуре.
Процесс подписания сильного имени (SN) использует стандартные алгоритмы хеширования и шифрования для сильной подписи имени. Генерация SHA-1 на большинстве файлов PE. Это хэш-значение RSA-подписан с закрытым ключом SN. Для в целях проверки открытый ключ хранится в файле PE, а также в значении хеш-символа.
За исключением следующих, все части файла PE хэшируются: • Запись подписи Authenticode: файлы PE могут быть аутентифицированы. Аутентод подпись содержится в 8-байтовой записи со смещением 128 в каталоге данных заголовка PE ( "Таблица сертификатов" в §25.2.3.3) и содержимое файла PE в диапазоне, указанном в этом запись в каталоге. [Примечание. В соответствующем файле PE эта запись должна быть равна нулю. конечная нота] • Сильное имя Blob: 8-байтная запись со смещением 32 заголовка CLI ( "StrongNameSignature" ) в п. 25.3.3) и содержимое хэш-данных, содержащихся в этом RVA в PE файле. Если 8-байтовый запись равна 0, нет ассоциированной сильной подписи. • Контрольная сумма заголовка PE: 4-байтная запись со смещением 64 заголовка PE-заголовка Windows NT-Specific Поля ( "Контрольная сумма файла" в §25.2.3.2). [Примечание. В соответствующем файле PE эта запись должна быть равна нулю. end note]
Вы можете бесплатно скачать эту опцию: http://www.ecma-international.org/publications/standards/Ecma-335.htm
Ответ 5
Ключ открытого ключа используется для идентификации организации в узле с жестким именем. Эта информация добавляется к сборке метабазы. Я бы предположил, что Ричард прав относительно технического способа его хранения.
Если вы хотите просмотреть метабазу сборки, используйте ILDASM. Вы можете перейти к тому, что хранится в метабазе, а не видеть IL.
Ответ 6
Это хэш-байты ключа, используемые для подписи сборки.
Поэтому вместо того, чтобы перечислять сотни шестнадцатеричных цифр для ключа, у вас есть что-то более простое, но все же с небольшим риском столкновений.