2009-07-28 11 views
90

Einer meiner Kollegen ist sehr daran interessiert, Baugruppen zu signieren. Er versucht buchstäblich irgendetwas zu unterschreiben. Selbst wenn wir Assemblys von Microsoft verwenden, die nicht signiert sind, nimmt er den Quellcode, unterzeichnet ihn und bittet dann andere Entwickler, stattdessen seine Kopie zu verwenden.Alles falsch, wenn Sie eine .NET-Assembly nicht signieren?

Ich kann die Grundidee hinter dem Unterzeichnen einer Assembly verstehen: um sicherzustellen, dass eine bestimmte Assembly nicht von einem zwielichtigen Hacker kompromittiert wird. Wenn wir ein Softwareentwicklungsunternehmen sind, sollten wir unsere Assembly unterschreiben, bevor wir eine .NET-Bibliothek für unsere Kunden veröffentlichen.

Wir entwickeln jedoch in erster Linie Web-Anwendungen für unseren eigenen Gebrauch, und ich kann einfach nicht den Punkt sehen, jede einzelne Baugruppe, die wir verwenden, zu signieren.

Fehle ich hier etwas?

+1

Es ist erwähnenswert einige Verwirrung hier, "digitale Signaturen" (die einen Sicherheits-Zweck haben) und "Strongally Assemblies" genannt, die eine Lösung für die Hölle sind und helfen, die GAC mit Bibliotheken zu verknüpfen. Die Verwendung der einen oder anderen ist ähnlich und beide können in Bezug auf die Unterzeichnung einer Versammlung gesprochen werden. Es scheint, als ob einige Poster an einen denken und andere an einen anderen oder beide denken. – amalgamate

Antwort

47

Das Signieren von Baugruppen, die in einer vertrauenswürdigen Umgebung verwendet werden, klingt für mich nach Overkill.

Ein interessanter Punkt bei vorzeichenbehafteten Assemblys ist, dass sie etwas langsamer geladen werden als nicht signierte Assemblys, da sie kryptographisch verifiziert werden müssen.

Um eine Baugruppe zu signieren, müssen alle Baugruppen, von denen sie abhängt, ebenfalls signiert sein. Ich schätze, das trägt dazu bei, dass Ihr Kollege alles unterschreiben will - der Compiler fordert das.


EDIT Da diese Antwort schreiben Sie sowohl das Pro und gegen Lager haben etwa gleichwertig Unterstützung sehen können. Hier gibt es eindeutig keine richtige Antwort.

Der Punkt, der diese Editierung erzwungen hat, ist, dass wir heutzutage so viele Open-Source-Bibliotheken von NuGet verwenden, und viele von ihnen werden überhaupt nicht signiert. Wenn Sie Ihre Assembly signieren möchten, müssen auch Abhängigkeiten signiert sein. Viele der signierten Open-Source-Bibliotheken haben die privaten Schlüssel, die zum Signieren verwendet werden, in ihren Quell-Repositories öffentlich verfügbar.

Wie bei allem gibt es Kompromisse zu machen. In meiner Erfahrung in der Arbeit in privaten Umgebungen, die Vorteile der Unterzeichnung sind meist theoretische (oder akademische, wie @user289100 Erwähnungen), es sei denn, Sie sind besorgt über Regierungsbehörden ändern Ihren Code in diesem Fall müssen Sie paranoid sein über so viele Ebenen Ihres Infrastruktur, die Unterzeichnung würde wie eine kleine Anstrengung erscheinen. Sonst scheint die Menge der Herausforderungen, die sich daraus ergeben, alles unterschreiben zu müssen, einfach nicht wert. Ihre Umgebung hat jedoch möglicherweise andere Anforderungen oder Sie sind Masochist!

Siehe auch Teun D's answer für Informationen zu Herausforderungen im Zusammenhang mit Versionierungsassemblys, wenn starke Namen verwendet werden.

+17

Einverstanden, es ist wie eine Crack-Sucht für ihn jetzt – Janie

+3

Ein weiterer Punkt zu beachten ist, wenn Sie diese Baugruppe über verschiedene Anwendungen teilen möchten, dann ist Signieren ein Muss (d. H. GAC). –

3

Ich stimme zu, es scheint wie ein bisschen eine Verschwendung. Es ist wirklich notwendig, um sicherzustellen, dass die Datei ist, was Sie denken, dass es ist (und wurde nicht manipuliert). Wenn Sie jedoch auf die Grenzen Ihrer eigenen Netzwerksicherheit und Ihres Webservers vertrauen, scheint die Signierung Ihrer Webassemblies ein überflüssiger Schritt zu sein.

Aber vielleicht ist das meine kleine Geschäftserfahrung, die spricht. Wenn Sie über eine geschäftskritische Online-Banking-Website sprechen, dann melden Sie sich ab.

9

Hat Ihnen Ihr Kollege irgendwelche Angaben zu warum er gerne Baugruppen signieren? Ein Vorteil beim Signieren, der hier noch nicht diskutiert wurde, ist, dass nur signierte Assemblys in den GAC gesetzt werden können (d. H.in verwaltete Prozesse geteilt werden), aber die Nachteile scheinen die Vorteile meiner (zugegebenermaßen unerfahrenen) Perspektive zu überwiegen.

Ihre Anekdote über selbst signierende Microsoft-Code scheint mir besonders verdächtig. Wenn MS den Code nicht signiert hat, gibt es wahrscheinlich einen Grund, richtig? Und indem du es unterzeichnest, übernimmst du die Verantwortung dafür, wenn du es nicht geschrieben hast - eine weitere Gelegenheit für die Zukunft, dich zu beißen.

+2

eigentlich bin ich nicht sicher, warum, aber Microsoft sicher nicht signiert Enterprise Library 3.1 – oscarkuo

+1

Warum für die Freigabe einer Assembly zwischen Prozessen erfordert die Assembly in der GAC zu sein? –

+4

Es ist nicht möglich, dass Laufzeitverweise nicht auf dieselbe DLL verteilt werden können. Es können nur Assemblys mit starken Namen (d. H. Signierte) in den GAC gelangen - und Assemblys werden in den GAC gestellt, damit sie gemeinsam genutzt werden können. –

4

Eine andere Sache über das Unterzeichnen einer Versammlung ist, dass man nicht inkorrekte an Stelle von Ihnen einspritzen kann (auch - sich durch einen Unfall). Wenn Sie beispielsweise ein Programm erstellen, das auf eine Assembly Foo.dll, Version 1.0, verweist, kann jemand eine Assembly mit der gleichen Version erstellen und Ihre ersetzen, wenn Sie Ihre Bibliothek signieren, ist dies nicht möglich (um zumindest glaube ich nicht, dass es leicht möglich ist).

4

Signaturen sind nur notwendig, wenn die Baugruppen im GAC platziert sind, sonst nichts. Signierte Assemblies verhindern nicht, dass sich jemand mit ihnen anlegt. Ein Hacker kann immer noch die Signatur und jeden anderen Code entfernen, der nach der Signatur sucht.

+2

Für eine Webanwendung müsste der Hacker auch die Datei web.config ändern. – Tangurena

+3

Wenn ein Hacker Signaturen aus einer Assembly entfernen kann, wird die web.config sie auch nicht stoppen. – ZippyV

+4

Downwoters wird geraten, http://ianpicknell.blogspot.com/2010/02/tampering-with-strong-named-assembly.html und ähnliche Artikel zu lesen. – Constantin

2

Denken Sie daran, es zu tun, wenn Sie etwas versenden und/oder einen Grund haben, es zu tun. In jedem anderen Fall ist es einfach mühselig. Ich würde deinen Arbeitskollegen fragen, was er eigentlich davon hat.

Ich habe schon früher assigned assembly-itis gesehen, und es ist ein Schmerz im posterior, besonders wenn man bedenkt, wie viele Leute wenig oder gar nicht wissen, wie man Assemblys signiert, wofür und wie man es macht. Es ist nur eine andere Sache, um die Sie sich nicht kümmern sollten, außer wenn es absolut notwendig ist.

38

Ein weiterer Punkt: das Signieren Ihrer Assemblies bricht die Rückwärtskompatibilität über Versionen. Ihre Referenzen beginnen alle mit Versionsnummern und Versionen mit anderen Versionsnummern gelten als nicht kompatibel. Dies erschwert die Aktualisierung auf neuere Versionen von verteilten Assemblys.

Meiner Meinung nach, sollten Sie nur Code-Zeichen Baugruppen, wenn Sie einige konkrete Verstärkung von ihm sehen:

  • wenn Sie Umgebungen einzusetzen, wo nicht vertrauenswürdige Menschen Ihrer Baugruppen
  • in bestimmten Plug-in anrühre Modelle, in denen Sie das Zertifikat als Beweis für die Aktualisierung der Vertrauensstellung verwenden möchten
  • wenn Ihr Code von anderen signierten Code aufrufbar sein sollte (ein Projekt wie, sagen log4net, unterzeichnet zu Recht ihren Code weithin verwendbar; sie vermasselt enorm in Kompatibilität durch den Verlust ihres geheimen Schlüssels vor ein paar Jahren, ein weiteres Risiko der Code-Signing).
  • wenn Sie wollen GAC bereitstellen
59

ich die Vorteile des nicht unterzeichneten Baugruppen genommen haben, bevor Probleme zu umgehen und im akademischen Umfeld Menschen gezeigt, warum es wichtig ist. Ich ersetzte eine DLL-Datei, die nicht signiert war (wieder in einer akademischen Umgebung) mit einer, die ich mit dem gleichen Namen, die gleichen Signaturen und .NET Reflector zum Kopieren und Einfügen des ursprünglichen Codes, aber in meinem schrieb ich Benutzernamen und Kennwörter, die sein vor dem Aufruf von "echtem" Code übergeben.

Wenn signiert, können Sie eine Signatur übereinstimmen, aber nicht ersetzen. Im Gegensatz zu dem, was Zippy sagt, wird es einen Fehler bei der Laufzeitkompilierung geben.

Das Signieren von Baugruppen ist niemals übertrieben. Es dauert 30 Sekunden. Es ist, als würde man sagen, wenn man auf dem Land lebt, ist es zuviel, wenn man seine Türen schließt. Wenn du mit deinem Hab und Gut spielen willst, mach weiter, lass es offen. Es braucht nur eine Sicherheitsverletzung, um gefeuert zu werden.Es dauert nur 30 Sekunden, um eine Assembly zu signieren. Die Auswirkungen auf die Leistung sind vernachlässigbar.

+11

Wenn ein Hacker die DLL ändern kann, kann er auch die Anwendung ändern, die die DLL aufruft. – ZippyV

+12

Das ist richtig Zippy, aber ohne den Schlüssel zu haben, um die Anwendung zu signieren, wird es ihnen schwer fallen, die Anwendung in einer Umgebung laufen zu lassen, in der nur die signierte Version der ursprünglichen Anwendung laufen darf, was der Fall wäre In mehreren Umgebungen, in denen ich gearbeitet habe. Den Wald für die Bäume zu vermissen: Das Unterzeichnen einer Assembly nimmt ein unnötiges Sicherheitsrisiko in Kauf, das 30 Sekunden dauert, und es gibt keinen Business Case oder Fall, den ich jemals gesehen habe unterschreibe keine Versammlung. – user289100

1

Sie müssen Ihre Baugruppe signieren, wenn sie in einem Deploy-from-the-Web ClickOnceXBAP verwendet wird.

Darüber hinaus müssen alle referenzierten Assemblies ebenfalls signiert werden.

1

Wir unseren Versammlungen unterschreiben, weil es Zeiten gibt, wenn wir Fehler wie folgt erhalten (dieses von der Prüfung ist, können aber auftreten, wenn die Anwendung ausgeführt wird):

System.IO.FileLoadException : Could not load file or assembly 'Latitude.Platform.Core, Version=1.0.5871.22518, Culture=neutral, PublicKeyToken=7926214d13e12325' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) 

TearDown : System.IO.FileLoadException : Could not load file or assembly 'Latitude.Platform.Core, Version=1.0.5871.22518, Culture=neutral, PublicKeyToken=7926214d13e12325' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) 

Wir gefunden hatte, dass Visual Studio bekommt es falsch manchmal und läuft alten Code.

Wenn Sie einen Fehler haben möchten, wenn Sie alten Code ausführen, dann signieren Sie Ihre Assemblys.

Wenn Sie ein nugget-Paket schreiben, unterschreiben Sie bitte Ihre Baugruppen. Unsignierte Assemblies sind für uns peinlich, die sicherstellen möchten, dass wir die neueste Version unseres Codes ausführen. Ich kann Visual Studio nicht beheben. Ich kann nur erkennen, dass Visual Studio es falsch verstanden hat. Bitte signieren Sie Ihre nugget Baugruppen.

+0

Ich sehe, dass Ihr Punkt mehr mit der Assembly-Version als mit der Unterzeichnung zusammenhängt! –

Verwandte Themen