Ich stimme nicht zu, dass die Unterzeichnung Ihrer Assemblies keine Rolle in der Sicherheit spielt. Ja, es wird verwendet, um eine Baugruppe zu identifizieren. Und standardmäßig wird die Signatur NICHT erzwungen. Insofern, ja, die Sicherheit wird nicht direkt nur durch das Signieren beeinflusst. Sie können jedoch Ihr Schlüsselpaar verwenden, um die Signaturprüfung zu erzwingen, ohne für ein CA-Zertifikat ausstellen zu müssen. Um dies zu tun, aber Sie müssen P/diese Funktion aufrufen:
Imports System.Runtime.InteropServices
Friend Class NativeMethods
<DllImport("mscoree.dll", CharSet:=CharSet.Unicode)> _
Public Shared Function StrongNameSignatureVerificationEx(wszFilePath As String, fForceVerification As Byte, ByRef pfWasVerified As Byte) As Boolean
End Function
End Class
Von dort Design eine Basisklasse, die Ihre geschützten Baugruppen aus erben können:
Imports System.Reflection
Imports System.Security.Cryptography
Public Class SignedClassBase
Shared Sub New()
VerifyAssemblySignature(Assembly.GetCallingAssembly())
End Sub
Public Sub New()
VerifyAssemblySignature(Assembly.GetCallingAssembly())
End Sub
Private Shared Sub VerifyAssemblySignature(assembly As Assembly)
Dim wasVerified As Boolean
If Not (NativeMethods.StrongNameSignatureVerificationEx(assembly.Location, True, wasVerified) AndAlso wasVerified) Then
Throw New CryptographicException("Verification failed: Assembly signature did not match.")
End If
End Sub
End Class
Und dann rufen Sie den Basiskonstruktor von abgeleiteten Klasse: Now
Public Class Utils
Inherits SignedClassBase
Shared Sub New()
RuntimeHelpers.RunClassConstructor(GetType(SignedClassBase).TypeHandle)
End Sub
Public Sub New()
MyBase.New()
End Sub
End Class
wenn eine modifizierte Anordnung instanziiert wird, wird ein aus dem Cryptographic Basisklassenkonstruktor werfen, von der abgeleiteten Klasse verhindert verwendet wird.
So, während die Code-Signatur nicht direkt an die Sicherheit gebunden ist, kann die erzwungene Assembly-Signatur definitiv zu der Sicherheit beitragen, die Sie bereits haben, in Verbindung mit starker Verschleierung, wo nötig. In dieser Hinsicht MUSS der private Schlüssel geheim bleiben.Das Teilen des privaten Schlüssels in einem Open-Source-Projekt ist einfach eine Möglichkeit, den beteiligten Entwicklern das Leben zu erleichtern. Es wäre VIEL besser, stattdessen die Assemblys als Teil des offiziellen Build-Prozesses zu signieren und Ihren privaten Schlüssel vollständig geheim zu halten. Andernfalls kann jeder eine Assembly mit möglicherweise bösartigem Code neu kompilieren und mit Ihrem privaten Schlüssel signieren und verfälschte Kopien Ihres Projekts verteilen.
Es ist also kein Problem, diesen privaten Schlüssel zu veröffentlichen, solange er nur für das Signieren dieser bestimmten Assembly verwendet wird. Oder, um es anders auszudrücken: Wenn Microsoft entscheiden würde, alle ihre .NET-Basisklassenbibliotheken auf GitHub zu öffnen, würden sie auch die .snk-Datei enthalten, die zum Signieren dieser Assemblys verwendet wird? –
Wenn sie den Leuten erlauben wollten, die offiziellen Versammlungen durch ihre eigenen Kopien im GAC zu ersetzen, ja. Und was Schaden anbelangt: Solange der private Schlüssel nur für stark benannte Signaturen verwendet wird, ist es in Ordnung, ihn zu verteilen. Wenn Sie auch den gleichen Schlüssel verwenden, um Authenticode Signing zu tun, dann besteht ein gewisses Risiko (Aber es gibt keinen Grund, nicht zwei separate Schlüssel zu verwenden) –
Es ist jetzt ein bisschen klarer, aber ich würde immer noch sagen, dass, sobald Sie diesen privaten Schlüssel machen Öffentlichkeit kann man nicht einmal mehr Einzigartigkeit garantieren. Jeder auf der Welt kann nun eine Assembly mit genau demselben starken Namen erstellen. Sie verlieren alle Vorteile, die Sie hatten, als es privat blieb. Sogar Jeffrey Richter in "CLR via C#" sagt, dass private Schlüssel, die beim Assembly Signing verwendet werden, auf sicheren Geräten gespeichert und niemals unternehmensübergreifend geteilt werden sollten. –