Для чего нужен .snk?

153

Для чего нужен файл .snk? Я знаю, что это означает « Строго именованный ключ» , но все объяснения, что это такое и как это работает, у меня над головой.

Есть ли простое объяснение того, как используется ключ со строгим именем и как он работает?

oɔɯǝɹ
источник

Ответы:

212

Файл .snk используется для применения строгого имени к сборке .NET . такое сильное имя состоит из

простое текстовое имя, номер версии и информация о культуре (если есть) - плюс открытый ключ и цифровая подпись.

SNK содержит уникальную пару ключей - закрытый и открытый ключи, которые можно использовать для обеспечения уникального строгого имени для сборки. Когда сборка имеет строгое имя, из содержимого сборки создается хеш, и хеш шифруется с помощью закрытого ключа. Затем этот подписанный хеш помещается в сборку вместе с открытым ключом из .snk.

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

Важно иметь возможность проверять сборки таким образом, чтобы никто не поменял сборку на вредоносную, которая разрушит все приложение. Вот почему сборкам со строгими именами не доверяют так же, как сборкам со строгими именами, поэтому они не могут быть помещены в GAC. Кроме того, существует цепочка доверия - вы не можете сгенерировать сборку со строгим именем, которая ссылается на сборки без строгого имени.

Статья " Секреты строгого именования (заархивирована на Wayback Machine) ". Отличная работа по объяснению этих понятий более подробно. С картинками.

Блэр Конрад
источник
2
Означает ли это, что когда вы подписываете сборку с помощью .PFX, она фактически просто использует ее для генерации .SNK на лету, когда она компилируется?
Патрик
5
@ Патрик нет, это подпись Authenticode, которая также подтверждает, что файл не был изменен между подписью и проверкой, но не соответствует требованиям строгого имени. Проблема заключается в том, что Authenticode не требует цепочки доверия сборок, которые требуются для строгого именования, поэтому вы можете подписать сборку Authenticode, основанную на сборках с неназванными именами / подписями.
Скотт Чемберлен
1
Вы можете просто снять snk и заменить его другим ... я не знаю реального сценария, где он полезен ... это в основном наши пары ключей, на которых нельзя построить доверие
Ибрагим
8
Ссылка WayBackMachine на «Секреты сильного имени»
asfeynman
Пожалуйста, обновите ссылку в ответе (на предложенную @asfeynman), поскольку ссылка мертва, и не все читают комментарии.
XelaNimed
22

В мире .Net файл SNK используется для подписи ваших скомпилированных двоичных файлов. Это позволяет пару вещей произойти:

  1. Вы можете зарегистрировать сборку в GAC (глобальный кэш сборок) . Таким образом, вы можете ссылаться на него из разных мест на одном компьютере без необходимости сохранять несколько копий).
  2. Вы можете использовать ваши двоичные файлы из других двоичных файлов, которые также подписаны (это странное вирусное поведение в отношении подписанных сборок).
  3. Ваша сборка не может (легко) быть изменена третьими лицами, которые не имеют доступа к файлу SNK, обеспечивая по крайней мере небольшой уровень безопасности.

Я не знаком с тем, как работает сервер BizTalk , поэтому я не думаю, что смогу пролить свет на то, какую конкретную цель они выполняют в этой среде.

Надеюсь, это было несколько полезно.

ckramer
источник
7

Файл .snk используется для подписания сборок, чтобы иметь возможность добавлять их в глобальный кэш сборок (GAC).

Файл .snk содержит публичные и приватные токены для вашего ключа. Если вы хотите подписать некоторые данные (или двоичные данные) этим ключом, для данных вычисляется контрольная сумма, которая затем шифруется с помощью личного токена. Зашифрованная контрольная сумма затем добавляется к данным. Любой может использовать открытый токен из вашего ключа, чтобы расшифровать контрольную сумму и сравнить ее с вычисленной контрольной суммой, чтобы убедиться, что подписанные данные не были подделаны.

Вы можете прочитать больше о криптографии с открытым ключом на http://en.wikipedia.org/wiki/Public-key_cryptography .

Франси Пенов
источник
4

Файл .snk - это постоянная версия вашего «Ключа», созданная утилитой sn в наборе утилит framework. Затем вы используете этот файл для «цифровой подписи» ваших сборок. Это двухкомпонентный ключ .. комбинация закрытого и открытого ключей. Публичная часть ключа опубликована, то есть известна всем. Приватная часть известна только вам, разработчику компонентов / приложений, и предназначена для сохранения таким образом.

Когда вы подписываете свою сборку, она использует закрытый ключ и хеш-значение для вашей сборки, чтобы создать цифровую подпись, встроенную в вашу сборку. После этого любой, кто загружает вашу сборку, проходит этап проверки. Открытый ключ используется для проверки, действительно ли сборка исходит от вас ... для этого вам просто нужен открытый ключ (который также встроен в токенизированную форму в манифесте сборки). Если сборка была подделана, значение хеша будет другим, и нагрузка на сборку будет прервана. Это механизм безопасности.

Gishu
источник
3

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

Когда для подписи сборки используется файл .snk, значение хеш-кода вычисляется из файла сборки и шифруется с использованием закрытого ключа. Затем этот зашифрованный «дайджест» прикрепляется к сборке вместе с открытым ключом из файла .snk.

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

В контексте BizTalk Server тот, кто создает какие-либо пользовательские сборки, используемые вашим решением BizTalk, должен будет использовать файл .snk для подписи сборки, чтобы сервер BizTalk мог загрузить его в GAC и использовать его.

Майкл Лэнг
источник