Freigeben über


Verbesserte starke Namen

Eine starke Namenssignatur ist ein Identitätsmechanismus im .NET Framework zum Identifizieren von Assemblys. Es handelt sich um eine digitale Signatur mit öffentlichem Schlüssel, die in der Regel verwendet wird, um die Integrität der Daten zu überprüfen, die von einem Absender (Signierer) an einen Empfänger (Verifier) übergeben werden. Diese Signatur wird als eindeutige Identität für eine Assembly verwendet und stellt sicher, dass Verweise auf die Assembly nicht mehrdeutig sind. Die Assembly wird als Teil des Buildprozesses signiert und anschließend überprüft, wenn sie geladen wird.

Starke Namenssignaturen helfen, bösartige Parteien daran zu hindern, eine Assembly zu manipulieren und sie anschließend mit dem Schlüssel des ursprünglichen Signaturgebers neu zu signieren. Sichere Namensschlüssel enthalten jedoch keine zuverlässigen Informationen über den Herausgeber und enthalten keine Zertifikathierarchie. Eine starke Namenssignatur garantiert nicht die Vertrauenswürdigkeit der Person, die die Assembly unterzeichnet hat, oder gibt an, ob diese Person ein legitimer Besitzer des Schlüssels war; sie gibt nur an, dass der Besitzer des Schlüssels die Assembly unterzeichnet hat. Daher wird die Verwendung einer starken Namenssignatur als Validierungsmechanismus für das Vertrauen in Drittanbietercode nicht empfohlen. Microsoft Authenticode ist die empfohlene Methode zum Authentifizieren von Code.

Einschränkungen herkömmlicher starker Namen

Die starke Benennungstechnologie, die in Versionen vor .NET Framework 4.5 verwendet wird, weist die folgenden Mängel auf:

  • Schlüssel werden ständig angegriffen, und verbesserte Techniken und Hardware erleichtern das Ableiten eines privaten Schlüssels von einem öffentlichen Schlüssel. Um vor Angriffen zu schützen, sind größere Schlüssel erforderlich. .NET Framework-Versionen vor .NET Framework 4.5 bieten die Möglichkeit, mit jedem Größenschlüssel zu signieren (die Standardgröße ist 1024 Bit), aber das Signieren einer Assembly mit einem neuen Schlüssel bricht alle Binärdateien auf, die auf die ältere Identität der Assembly verweisen. Daher ist es äußerst schwierig, die Größe eines Signaturschlüssels zu aktualisieren, wenn Sie die Kompatibilität beibehalten möchten.

  • Starke Namenssignierung unterstützt nur den SHA-1-Algorithmus. SHA-1 wurde kürzlich als unzureichend für sichere Hashing-Anwendungen gefunden. Daher ist ein stärkerer Algorithmus (SHA-256 oder höher) erforderlich. Es ist möglich, dass SHA-1 seinen FIPS-konformen Stand verliert, was Für diejenigen, die sich entscheiden, nur FIPS-kompatible Software und Algorithmen zu verwenden, Probleme darstellen würde.

Vorteile erweiterter starker Namen

Die Hauptvorteile erweiterter starker Namen sind Kompatibilität mit bereits vorhandenen starken Namen und die Fähigkeit, geltend zu machen, dass eine Identität einem anderen entspricht:

  • Entwickler, die bereits signierte Assemblys haben, können ihre Identitäten zu den SHA-2-Algorithmen migrieren und gleichzeitig die Kompatibilität mit Assemblys beibehalten, die auf die alten Identitäten verweisen.

  • Entwickler, die neue Assemblys erstellen und sich nicht mit bereits vorhandenen starken Namenssignaturen befassen, können die sichereren SHA-2-Algorithmen verwenden und die Assemblys wie immer signieren.

Verwenden Sie erweiterte starke Namen

Sichere Namensschlüssel bestehen aus einem Signaturschlüssel und einem Identitätsschlüssel. Die Assembly wird mit dem Signaturschlüssel signiert und durch den Identitätsschlüssel identifiziert. Vor .NET Framework 4.5 waren diese beiden Schlüssel identisch. Ab .NET Framework 4.5 bleibt der Identitätsschlüssel mit früheren .NET Framework-Versionen identisch, der Signaturschlüssel wird jedoch mit einem stärkeren Hashalgorithmus verbessert. Darüber hinaus wird der Signaturschlüssel mit dem Identitätsschlüssel signiert, um eine Gegensignatur zu erstellen.

Das AssemblySignatureKeyAttribute Attribut ermöglicht es den Assemblymetadaten, den bereits vorhandenen öffentlichen Schlüssel für die Assemblyidentität zu verwenden, wodurch alte Assemblyverweise weiterhin funktionieren können. Das AssemblySignatureKeyAttribute Attribut verwendet die Gegensignatur, um sicherzustellen, dass der Besitzer des neuen Signaturschlüssels auch der Besitzer des alten Identitätsschlüssels ist.

Signieren mit SHA-2 ohne Schlüsselmigration

Führen Sie die folgenden Befehle über eine Eingabeaufforderung aus, um eine Assembly zu signieren, ohne die Signatur eines starken Namens zu migrieren:

  1. Generieren Sie den neuen Identitätsschlüssel (falls erforderlich).

    sn -k IdentityKey.snk  
    
  2. Extrahieren Sie den öffentlichen Identitätsschlüssel, und geben Sie an, dass beim Signieren mit diesem Schlüssel ein SHA-2-Algorithmus verwendet werden soll.

    sn -p IdentityKey.snk IdentityPubKey.snk sha256  
    
  3. Führen Sie eine verzögerte Signierung der Assembly mit der öffentlichen Identitätsschlüsseldatei durch.

    csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+  
    
  4. Signieren Sie die Assemblierung erneut mit dem vollständigen Identitätsschlüsselpaar.

    sn -Ra MyAssembly.exe IdentityKey.snk  
    

Signieren mit SHA-2 mit Schlüsselmigration

Führen Sie die folgenden Befehle über eine Eingabeaufforderung aus, um eine Assembly zu signieren und dabei eine migrierte Signatur eines starken Namens zu verwenden.

  1. Generieren Sie ein Identitäts- und Signaturschlüsselpaar (falls erforderlich).

    sn -k IdentityKey.snk  
    sn -k SignatureKey.snk  
    
  2. Extrahieren Sie den öffentlichen Signaturschlüssel, und geben Sie an, dass beim Signieren mit diesem Schlüssel ein SHA-2-Algorithmus verwendet werden soll.

    sn -p SignatureKey.snk SignaturePubKey.snk sha256  
    
  3. Extrahieren Sie den öffentlichen Identitätsschlüssel, der den Hashalgorithmus bestimmt, der eine Gegensignatur generiert.

    sn -p IdentityKey.snk IdentityPubKey.snk  
    
  4. Generieren Sie die Parameter für ein AssemblySignatureKeyAttribute Attribut, und fügen Sie das Attribut an die Assembly an.

    sn -a IdentityPubKey.snk IdentityKey.snk SignaturePubKey.snk  
    

    Dadurch wird eine Ausgabe erzeugt, die der Folgenden ähnelt:

    Information for key migration attribute.
    (System.Reflection.AssemblySignatureKeyAttribute):
    publicKey=
    002400000c80000094000000060200000024000052534131000400000100010005a3a81ac0a519
    d96244a9c589fc147c7d403e40ccf184fc290bdd06c7339389a76b738e255a2bce1d56c3e7e936
    e4fc87d45adc82ca94c716b50a65d39d373eea033919a613e4341c66863cb2dc622bcb541762b4
    3893434d219d1c43f07e9c83fada2aed400b9f6e44ff05e3ecde6c2827830b8f43f7ac8e3270a3
    4d153cdd
    
    counterSignature=
    e3cf7c211678c4d1a7b8fb20276c894ab74c29f0b5a34de4d61e63d4a997222f78cdcbfe4c91eb
    e1ddf9f3505a32edcb2a76f34df0450c4f61e376b70fa3cdeb7374b1b8e2078b121e2ee6e8c6a8
    ed661cc35621b4af53ac29c9e41738f199a81240e8fd478c887d1a30729d34e954a97cddce66e3
    ae5fec2c682e57b7442738
    

    Diese Ausgabe kann dann in ein AssemblySignatureKeyAttribute transformiert werden.

    [assembly:System.Reflection.AssemblySignatureKeyAttribute(
    "002400000c80000094000000060200000024000052534131000400000100010005a3a81ac0a519d96244a9c589fc147c7d403e40ccf184fc290bdd06c7339389a76b738e255a2bce1d56c3e7e936e4fc87d45adc82ca94c716b50a65d39d373eea033919a613e4341c66863cb2dc622bcb541762b43893434d219d1c43f07e9c83fada2aed400b9f6e44ff05e3ecde6c2827830b8f43f7ac8e3270a34d153cdd",
    "e3cf7c211678c4d1a7b8fb20276c894ab74c29f0b5a34de4d61e63d4a997222f78cdcbfe4c91ebe1ddf9f3505a32edcb2a76f34df0450c4f61e376b70fa3cdeb7374b1b8e2078b121e2ee6e8c6a8ed661cc35621b4af53ac29c9e41738f199a81240e8fd478c887d1a30729d34e954a97cddce66e3ae5fec2c682e57b7442738"
    )]
    
  5. Führen Sie eine verzögerte Signierung der Assembly mit dem öffentlichen Identitätsschlüssel durch.

    csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+  
    
  6. Führen Sie eine vollständige Signatur der Assembly mit dem Signaturschlüsselpaar durch.

    sn -Ra MyAssembly.exe SignatureKey.snk  
    

Siehe auch