À quoi sert un .snk?

153

À quoi sert un fichier .snk? Je sais que cela signifie Strongly Named Key , mais toutes les explications sur ce que c'est et comment cela fonctionne me passent dessus.

Y a-t-il une explication simple sur la façon dont une clé fortement nommée est utilisée et comment elle fonctionne?

oɔɯǝɹ
la source

Réponses:

212

Le fichier .snk est utilisé pour appliquer un nom fort à un assembly .NET . un nom si fort se compose de

un simple nom de texte, un numéro de version et des informations sur la culture (le cas échéant) - plus une clé publique et une signature numérique.

Le SNK contient une paire de clés unique - une clé privée et publique qui peut être utilisée pour garantir que vous disposez d'un nom fort unique pour l'assembly. Lorsque l'assembly porte un nom fort, un "hachage" est construit à partir du contenu de l'assembly et le hachage est chiffré avec la clé privée. Ensuite, ce hachage signé est placé dans l'assembly avec la clé publique du .snk.

Plus tard, lorsque quelqu'un a besoin de vérifier l'intégrité de l'assembly fortement nommé, ils construisent un hachage du contenu de l'assembly et utilisent la clé publique de l'assembly pour décrypter le hachage fourni avec l'assembly - si les deux hachages correspondent, la vérification de l'assemblage réussit.

Il est important de pouvoir vérifier les assemblys de cette manière pour s'assurer que personne n'échange un assemblage contre un assemblage malveillant qui subvertira l'ensemble de l'application. C'est pourquoi les assemblys non nommés forts ne sont pas approuvés de la même manière que les assemblys fortement nommés, ils ne peuvent donc pas être placés dans le GAC. En outre, il existe une chaîne de confiance - vous ne pouvez pas générer d'assembly fortement nommé qui référence des assemblys non fortement nommés.

L'article " Les secrets de la dénomination forte (archivé à la Wayback Machine) ". Fait un excellent travail pour expliquer ces concepts plus en détail. Avec des photos.

Blair Conrad
la source
2
Cela signifie-t-il que lorsque vous signez un assembly avec un .PFX, il l'utilise simplement pour générer un .SNK à la volée chaque fois qu'il se compile?
Patrick
5
@Patrick non, c'est la signature Authenticode qui, bien qu'elle prouve également que le fichier n'a pas été modifié entre la signature et la vérification, ne remplit pas les exigences de nom fort. Le problème est qu'Authenticode ne nécessite pas de chaîne de confiance d'assemblys requise par la dénomination forte afin que vous puissiez Authenticode signer un assembly qui repose sur des assemblys nommés / signés non forts.
Scott Chamberlain
1
Vous pouvez simplement retirer le snk et le remplacer par un autre .. je ne connais pas de scénario réel où il est utile .. ce sont essentiellement nos paires de clés sur lesquelles vous ne pouvez pas établir de confiance
Ibrahim
8
Lien WayBackMachine vers The Secrets of Strong Name
asfeynman
Veuillez mettre à jour le lien dans la réponse (à celui suggéré par @asfeynman), car le lien est mort et tout le monde ne lit pas les commentaires.
XelaNimed le
22

Dans un monde the.Net, le fichier SNK est utilisé pour signer vos binaires compilés. Cela permet à deux choses de se produire:

  1. Vous pouvez enregistrer l'Assemblée dans le GAC (Global Assembly Cache) . Fondamentalement, vous pouvez le référencer à partir de plusieurs endroits sur la même machine sans avoir à conserver plusieurs copies).
  2. Vous pouvez utiliser vos fichiers binaires à partir d'autres binaires qui sont également signés (il s'agit d'un comportement viral étrange en ce qui concerne les assemblys signés).
  3. Votre assemblage ne peut pas (facilement) être modifié par des tiers qui n'ont pas accès au fichier SNK, offrant au moins une petite quantité de sécurité.

Je ne suis pas familier avec le fonctionnement du serveur BizTalk , donc je ne pense pas pouvoir apporter beaucoup de lumière sur l'objectif spécifique qu'ils servent dans cet environnement.

J'espère que cela a été quelque peu utile.

ckramer
la source
7

Le fichier .snk est utilisé pour signer les assemblys afin de pouvoir les ajouter au Global Assembly Cache (GAC).

Le fichier .snk contient les jetons publics et privés de votre clé. Lorsque vous souhaitez signer des données (ou binaires) avec cette clé, une somme de contrôle est calculée sur les données, qui sont ensuite chiffrées avec le jeton privé. La somme de contrôle chiffrée est ensuite ajoutée aux données. N'importe qui peut utiliser le jeton public de votre clé pour déchiffrer la somme de contrôle et la comparer à la somme de contrôle calculée pour vérifier que les données signées n'ont pas été falsifiées.

Vous pouvez en savoir plus sur la cryptographie à clé publique à http://en.wikipedia.org/wiki/Public-key_cryptography .

Franci Penov
la source
4

Un fichier .snk est une version persistante de votre "Clé" produite par l'utilitaire sn dans l'ensemble d'utilitaires du framework. Vous utilisez ensuite ce fichier pour «signer numériquement» vos assemblys. Il s'agit d'une clé en deux parties. Combinaison de clés privée-publique. La partie publique de la clé est publiée c'est-à-dire connue de tous. La partie privée n'est connue que de vous, le développeur du composant / de l'application et est destinée à être conservée de cette façon.

Lorsque vous signez votre assembly, il utilise la clé privée et une valeur de hachage pour votre assembly pour créer une signature numérique qui est incorporée dans votre assembly. Par la suite, toute personne qui charge votre assemblage passe par une étape de vérification. La clé publique est utilisée pour valider si l'assembly vient vraiment de vous ... vous avez juste besoin de la clé publique pour cela (qui est également incorporée sous une forme tokenisée dans le manifeste de l'assembly). Si l'assembly a été falsifié, la valeur de hachage serait différente et le chargement de l'assembly serait abandonné. C'est un mécanisme de sécurité.

Gishu
la source
3

Un fichier .snk est utilisé pour s'assurer que quelqu'un d'autre ne peut pas glisser un assemblage à la place du vôtre. Il fournit une paire de clés de cryptage / décryptage.

Lorsqu'un fichier .snk est utilisé pour signer un assembly, une valeur de hashcode est calculée à partir du fichier d'assembly et chiffrée à l'aide de la clé privée. Ce «condensé» chiffré est ensuite ajouté à l'assembly avec la clé publique du fichier .snk.

Ensuite, lorsque quelqu'un reçoit votre assembly, il peut également calculer cette valeur de hashcode. Ils utilisent la clé publique pour décrypter celle que vous avez calculée et comparer les valeurs calculées. Si l'assemblage a été modifié du tout, ces valeurs seront différentes et l'utilisateur de l'assemblage saura que l'assemblage que vous avez n'est pas celui que vous avez fourni.

Dans le contexte de BizTalk Server, quiconque crée des assemblys personnalisés utilisés par votre solution BizTalk devra utiliser un fichier .snk pour signer l'assembly afin que le serveur BizTalk puisse le charger dans le GAC et l'utiliser.

Michael Lang
la source