C #: Warum eine Versammlung unterschreiben?

146

In einigen C # -Codes, die ich übernommen habe (in Visual Studio 2005), habe ich festgestellt, dass die Assemblys alle mit derselben .snkDatei signiert sind .

  • Warum hätte der vorherige Autor die Versammlungen auf diese Weise unterschrieben?
  • Ist das Signieren von Assemblys erforderlich und was wäre falsch daran, nicht zu signieren?
  • Welche Nachteile hat das Signieren von Baugruppen - verursacht dies Verzögerungen?
Craig Johnston
quelle

Antworten:

186

Warum hätte der vorherige Autor die Versammlungen auf diese Weise unterschrieben?

Keine Ahnung, vielleicht wollte er, dass alle seine Versammlungen mit demselben Schlüssel signiert wurden.

Ist das Signieren von Assemblys erforderlich und was wäre falsch daran, sie nicht zu signieren?

Nein, dies ist nicht erforderlich, aber es handelt sich um einen Mechanismus, mit dem Sie die Authentizität einer Baugruppe sicherstellen können. Auf diese Weise können Sie sicherstellen, dass eine Baugruppe nicht manipuliert wurde und tatsächlich von diesem Autor stammt. Dies ist auch erforderlich, wenn Sie sie in den GAC einfügen möchten.

Welche Nachteile hat das Signieren von Baugruppen - verursacht dies Verzögerungen?

Signierte Assemblys können nur andere signierte Assemblys laden. Außerdem sind sie an eine bestimmte Version gebunden, was bedeutet, dass Sie Bindungsumleitungen verwenden oder die Anwendung neu kompilieren müssen, wenn Sie eine andere Version verwenden möchten. Aufgrund der Überprüfung der Signatur entsteht ebenfalls ein geringer Leistungsaufwand, der jedoch so gering ist, dass Sie sich keine Sorgen machen sollten.

Darin Dimitrov
quelle
2
Beachten Sie, dass die Überprüfung von Signaturen (seit .NET 2.0) in GAC nicht mehr erfolgt. Es kommt nur einmal vor, wenn es dem GAC hinzugefügt wird .
Abel
1
Was denkst du heutzutage darüber, es zu unterschreiben? Auf webbasierten Systemen? Wenn ich richtig liege, war es nur notwendig, wenn es um installierte Software ging, oder? Wenn ich meine App mit TFS in Azure veröffentliche, weiß ich, dass sie nicht manipuliert wurde, oder? Oder fehlt mir ein Sicherheitsteil?
Rick Wolff
Zur ersten Frage: Er hat eine Projektvorlage aus einem Projekt mit einer Assembly-Signatur-Schlüsseldatei erstellt, dann diese Projektvorlage verwendet, um ein anderes Material zu erstellen, und vergessen, die Schlüsseldatei zu ersetzen. (Ersetzen Sie einfach "er" durch "mich" und Sie wissen, was ich heute Morgen getan habe :)). Es ist also ein Zufall.
hardyVeles
33

Sie müssen Assemblys signieren, wenn Sie sie in den GAC einfügen möchten .

Wenn Sie eine ausführbare Datei signieren, müssen auch alle Klassenbibliotheken signiert werden, mit denen sie verknüpft ist. Dies kann schwierig sein, wenn Sie eine Bibliothek eines Drittanbieters verwenden (insbesondere, wenn Sie ein ActiveX- Steuerelement oder ähnliches verwenden müssen).

Richard Grimes hat einen guten Workshop zum Thema Sicherheit in .NET geschrieben , der ein Kapitel dazu enthält: Sicherheitsworkshop

Der Grund dafür, dass alle Assemblys mit derselben .snk-Datei signiert werden, könnte sein, dass er Komponententests mit Codeabdeckung verwendet. Um Codeabdeckung durchführen zu können (zumindest mit den in der Testversion von Visual Studio 2005 integrierten Tools) und wenn die Assemblys signiert sind, müssen Sie angeben, welche .snk-Dateien für die Signierung verwendet werden, aber ich denke, Sie können dies nur Geben Sie eine .snk-Datei für die gesamte Lösung an. Wenn Sie also die verschiedenen Klassenbibliotheken mit unterschiedlichen .snk-Dateien signieren, können Sie jeweils nur die Codeabdeckung für eine von ihnen überprüfen.

Hans Olsson
quelle
17

Ein sehr wichtiger Grund für die Unterzeichnung einer Baugruppe ist, dass Sie sicher sein können, dass es sich um Ihre Baugruppe handelt. Da der private Schlüssel Ihnen gehört, kann niemand eine Assembly mit demselben Schlüssel signieren. Dies bedeutet, dass wenn der öffentliche Schlüssel einer Assembly einer ist, den Sie kennen (Sie können ihn mit der GetType().Assembly.GetName().GetPublicKey()Funktion abrufen ), die Assembly Ihnen gehört und nicht manipuliert wurde.

Pieter van Ginkel
quelle
1

Trotz aller Verwendungen der Signatur-DLL sollte die DLL nur aus zwei Gründen signiert werden

1. Versionierung

2. Authentifizierung

ein. Die Versionierung gibt an, auf welcher Version die DLL aufgebaut wurde, und während sie in GAC verschoben werden, können zwei DLLs mit demselben Namen, aber unterschiedlicher Version vorhanden sein

b. Die Authentifizierung gibt an, ob die DLL nicht manipuliert wurde und bei ihrer Erstellung gleich existiert.

Wenn Sie mehr über die Grundlagen und das Signieren von DLLs erfahren möchten, können Sie hier darauf verweisen

Karthikeyan VK
quelle
1
Was denkst du heutzutage darüber, es zu unterschreiben? Auf webbasierten Systemen? Wenn ich richtig liege, war es nur notwendig, wenn es um installierte Software ging, oder? Wenn ich meine App mit TFS in Azure veröffentliche, weiß ich, dass sie nicht manipuliert wurde, oder? Oder fehlt mir ein Sicherheitsteil?
Rick Wolff
1
Ich sehe keinen Grund, warum wir jetzt eine DLL unterzeichnen sollten, die als Paas-Lösung in Azure bereitgestellt wird. Wenn Sie jedoch eine iaas-Lösung haben, können Sie die DLL möglicherweise per Webanwendung im selben iis wiederverwenden. Was ich nicht empfehle. Wir sollten sie über eine API-URL aufrufen, anstatt diese DLLs von GAC (Microservice Architecture) zu verwenden.
Karthikeyan VK
1

Zusätzlich zu den bestehenden Antworten, möchte ich hinzufügen , dass Sie verwenden müssen , die Unterzeichnung , wenn Ihr DLL von 3rd - Party - Software dynamisch geladen und verbraucht werden wird. Es ist an sich keine technische Anforderung, aber es ist vernünftig, daher sehr häufig, dass der Softwarehersteller eines Drittanbieters diese Richtlinie aus Sicherheitsgründen durchsetzt.

Beispiele, bei denen Sie eine Baugruppe unterzeichnen müssen:

  • Entwicklung der Windows Shell / Windows Explorer-Erweiterung, wie z. B.: Kontextmenü-Erweiterung für Windows Explorer
  • Entwicklung von Visual Studio-Erweiterungen, wie z. B.: Benutzeroberfläche des Assistenten für Projekt- / Objektvorlagen
hardyVeles
quelle
0

Unterzeichnung und Montage ist wichtig. Um sicherzustellen, dass die Exe oder Assembly nur auf diesem PC installiert ist.

Dh wenn Sie diesen Ordner kopieren und auf einen anderen PC legen, funktioniert es nicht. da diese Assembly nur auf diesem Computer angemeldet wird.

Ram Kumar
quelle