Wofür ist ein .snk?

153

Wofür ist eine .snk-Datei? Ich weiß, dass es für Strongly Named Key steht , aber alle Erklärungen darüber, was es ist und wie es funktioniert, gehen mir über den Kopf.

Gibt es eine einfache Erklärung, wie ein stark benannter Schlüssel verwendet wird und wie er funktioniert?

oɔɯǝɹ
quelle

Antworten:

212

Die .snk-Datei wird verwendet, um einer .NET-Assembly einen starken Namen zuzuweisen . so ein starker Name besteht aus

Ein einfacher Textname, eine Versionsnummer und Kulturinformationen (falls angegeben) - plus einen öffentlichen Schlüssel und eine digitale Signatur.

Das SNK enthält ein eindeutiges Schlüsselpaar - einen privaten und einen öffentlichen Schlüssel, mit denen sichergestellt werden kann, dass Sie einen eindeutigen starken Namen für die Assembly haben. Wenn die Assembly einen starken Namen hat, wird aus dem Inhalt der Assembly ein "Hash" erstellt und der Hash mit dem privaten Schlüssel verschlüsselt. Dann wird dieser signierte Hash zusammen mit dem öffentlichen Schlüssel von .snk in die Assembly eingefügt.

Später, wenn jemand braucht die Integrität des stark genannten zu überprüfen , Montage, sie bauen einen Hash des Inhalts der Montage, und verwenden Sie den öffentlichen Schlüssel von der Anordnung der Hash zu entschlüsseln , die mit der Montage kam - wenn die beiden Hashes übereinstimmen, Die Baugruppenüberprüfung besteht.

Es ist wichtig, Assemblys auf diese Weise überprüfen zu können, um sicherzustellen, dass niemand eine Assembly gegen eine böswillige austauscht, die die gesamte Anwendung untergräbt. Aus diesem Grund wird nicht stark benannten Assemblys nicht wie vertrauenswürdigen Assemblys vertraut, sodass sie nicht im GAC platziert werden können. Außerdem gibt es eine Vertrauenskette: Sie können keine Assembly mit starkem Namen generieren, die auf Assemblys mit nicht starkem Namen verweist.

Der Artikel " Die Geheimnisse der starken Benennung ". Erklärt diese Konzepte hervorragend detaillierter. Mit Bildern.

Blair Conrad
quelle
2
Bedeutet dies, dass beim Signieren einer Assembly mit einer .PFX-Datei diese tatsächlich nur verwendet wird, um bei jeder Kompilierung eine .SNK im laufenden Betrieb zu generieren?
Patrick
5
@Patrick nein, das ist die Authenticode-Signatur, die zwar auch beweist, dass die Datei zwischen dem Signieren und dem Prüfen nicht geändert wurde, aber die strengen Namensanforderungen nicht erfüllt. Das Problem ist, dass Authenticode keine Vertrauenskette für Assemblys erfordert, für die eine starke Benennung erforderlich ist, sodass Sie Authenticode eine Assembly signieren können, die auf nicht stark benannten / signierten Assemblys basiert.
Scott Chamberlain
1
Sie können den snk einfach abstreifen und durch einen anderen ersetzen. Ich kenne kein wirkliches Szenario, in dem es nützlich ist. Es sind im Grunde unsere Schlüsselpaare, auf die Sie kein Vertrauen aufbauen können
Ibrahim
7
WayBackMachine Link zu den Geheimnissen des starken Namens
Asfeynman
22

In einer the.Net-Welt wird die SNK- Datei zum Signieren Ihrer kompilierten Binärdateien verwendet. Dies ermöglicht ein paar Dinge zu passieren:

  1. Sie können die Assembly im GAC (Global Assembly Cache) registrieren . Grundsätzlich können Sie also von vielen Stellen auf demselben Computer aus darauf verweisen, ohne mehrere Kopien verwalten zu müssen.
  2. Sie können Ihre Binärdateien in anderen Binärdateien verwenden, die ebenfalls signiert sind (dies ist ein seltsames virales Verhalten in Bezug auf signierte Assemblys).
  3. Ihre Assembly kann nicht (einfach) von Dritten geändert werden , die keinen Zugriff auf die SNK-Datei haben, was zumindest ein geringes Maß an Sicherheit bietet.

Ich bin nicht mit der Funktionsweise des BizTalk-Servers vertraut , daher glaube ich nicht, dass ich viel Licht darauf werfen kann, welchen spezifischen Zweck sie in dieser Umgebung erfüllen.

Hoffe das war etwas hilfreich.

ckramer
quelle
7

Die .snk-Datei wird zum Signieren der Assemblys verwendet, um sie dem Global Assembly Cache (GAC) hinzufügen zu können.

Die .snk-Datei enthält die öffentlichen und privaten Token für Ihren Schlüssel. Wenn Sie einige Daten (oder Binärdaten) mit diesem Schlüssel signieren möchten, wird eine Prüfsumme für die Daten berechnet, die dann mit dem privaten Token verschlüsselt wird. Die verschlüsselte Prüfsumme wird dann zu den Daten hinzugefügt. Jeder kann das öffentliche Token Ihres Schlüssels verwenden, um die Prüfsumme zu entschlüsseln und mit der von ihm berechneten Prüfsumme zu vergleichen, um sicherzustellen, dass die signierten Daten nicht manipuliert wurden.

Weitere Informationen zur Kryptografie mit öffentlichen Schlüsseln finden Sie unter http://en.wikipedia.org/wiki/Public-key_cryptography .

Franci Penov
quelle
4

Eine .snk-Datei ist eine persistente Version Ihres "Schlüssels", die vom Dienstprogramm sn im Framework-Dienstprogrammsatz erstellt wurde. Sie verwenden diese Datei dann, um Ihre Baugruppen digital zu signieren. Es ist ein zweiteiliger Schlüssel. Kombination aus privat und öffentlichem Schlüssel. Der öffentliche Teil des Schlüssels wird veröffentlicht, dh allen bekannt. Der private Teil ist nur Ihnen, dem Komponenten- / App-Entwickler, bekannt und soll auf diese Weise beibehalten werden.

Wenn Sie Ihre Assembly signieren, werden der private Schlüssel und ein Hashwert für Ihre Assembly verwendet, um eine digitale Signatur zu erstellen, die in Ihre Assembly eingebettet ist. Danach durchläuft jeder, der Ihre Baugruppe lädt, einen Überprüfungsschritt. Der öffentliche Schlüssel wird verwendet, um zu überprüfen, ob die Assembly wirklich von Ihnen stammt. Dazu benötigen Sie lediglich den öffentlichen Schlüssel (der auch in einer Token-Form im Assembly-Manifest eingebettet ist). Wenn die Baugruppe manipuliert wurde, ist der Hashwert unterschiedlich und die Baugruppenlast wird abgebrochen. Dies ist ein Sicherheitsmechanismus.

Gishu
quelle
3

Eine .snk-Datei wird verwendet, um sicherzustellen, dass eine andere Person keine eigene Baugruppe an Ihre Stelle setzen kann. Es bietet ein Paar Verschlüsselungs- / Entschlüsselungsschlüssel.

Wenn eine .snk-Datei zum Signieren einer Assembly verwendet wird, wird ein Hashcode-Wert aus der Assembly-Datei berechnet und mit dem privaten Schlüssel verschlüsselt. Dieser verschlüsselte "Digest" wird dann zusammen mit dem öffentlichen Schlüssel aus der .snk-Datei an die Assembly angeheftet.

Wenn dann jemand Ihre Assembly erhält, kann er auch diesen Hashcode-Wert berechnen. Sie verwenden den öffentlichen Schlüssel, um den von Ihnen berechneten zu entschlüsseln und die berechneten Werte zu vergleichen. Wenn die Baugruppe überhaupt geändert wurde, sind diese Werte unterschiedlich und der Benutzer der Baugruppe weiß, dass die von Ihnen bereitgestellte Baugruppe nicht die von Ihnen angegebene ist.

Im Kontext von BizTalk Server muss jeder, der benutzerdefinierte Assemblys erstellt, die von Ihrer BizTalk-Lösung verwendet werden, eine .snk-Datei verwenden, um die Assembly zu signieren, damit BizTalk Server sie in den GAC laden und verwenden kann.

Michael Lang
quelle