Dela via


Förbättrad stark namngivning

En stark namnsignatur är en identitetsmekanism i .NET Framework för att identifiera sammansättningar. Det är en offentlig digital signatur som vanligtvis används för att verifiera integriteten för data som skickas från en upphovsman (undertecknare) till en mottagare (kontrollant). Den här signaturen används som en unik identitet för en sammansättning och säkerställer att referenser till sammansättningen inte är tvetydiga. Sammansättningen signeras som en del av byggprocessen och verifieras sedan när den läses in.

Starka namnsignaturer hjälper till att förhindra att skadliga parter manipulerar en sammansättning och sedan signerar om sammansättningen med den ursprungliga undertecknarens nyckel. Starka namnnycklar innehåller dock ingen tillförlitlig information om utgivaren och innehåller inte heller någon certifikathierarki. En stark namnsignatur garanterar inte tillförlitligheten hos den person som undertecknade sammansättningen eller anger om personen var en legitim ägare av nyckeln; det anger bara att ägaren av nyckeln signerade sammansättningen. Därför rekommenderar vi inte att du använder en stark namnsignatur som säkerhetsverifierare för att lita på kod från tredje part. Microsoft Authenticode är det rekommenderade sättet att autentisera kod.

Begränsningar för konventionella starka namn

Den starka namngivningsteknik som används i versioner före .NET Framework 4.5 har följande brister:

  • Nycklar attackeras ständigt och förbättrade tekniker och maskinvara gör det lättare att härleda en privat nyckel från en offentlig nyckel. För att skydda mot attacker krävs större nycklar. .NET Framework-versioner före .NET Framework 4.5 ger möjlighet att signera med valfri storleksnyckel (standardstorleken är 1 024 bitar), men signering av en sammansättning med en ny nyckel bryter alla binärfiler som refererar till den äldre identiteten för sammansättningen. Därför är det mycket svårt att uppgradera storleken på en signeringsnyckel om du vill behålla kompatibiliteten.

  • Stark namnsignering stöder endast SHA-1-algoritmen. SHA-1 har nyligen visat sig vara otillräckligt för säkra hash-program. Därför krävs en starkare algoritm (SHA-256 eller senare). Det är möjligt att SHA-1 förlorar sin FIPS-kompatibla ställning, vilket skulle innebära problem för dem som väljer att endast använda FIPS-kompatibel programvara och algoritmer.

Fördelar med förbättrade starka namn

De största fördelarna med förbättrade starka namn är kompatibilitet med befintliga starka namn och möjligheten att hävda att en identitet motsvarar en annan:

  • Utvecklare som har redan befintliga signerade sammansättningar kan migrera sina identiteter till SHA-2-algoritmerna samtidigt som de upprätthåller kompatibilitet med sammansättningar som refererar till de gamla identiteterna.

  • Utvecklare som skapar nya sammansättningar och inte bryr sig om befintliga starka namnsignaturer kan använda de säkrare SHA-2-algoritmerna och signera sammansättningarna som de alltid har gjort.

Använda förbättrade starka namn

Starka namnnycklar består av en signaturnyckel och en identitetsnyckel. Sammansättningen signeras med signaturnyckeln och identifieras av identitetsnyckeln. Före .NET Framework 4.5 var dessa två nycklar identiska. Från och med .NET Framework 4.5 förblir identitetsnyckeln densamma som i tidigare .NET Framework-versioner, men signaturnyckeln förbättras med en starkare hash-algoritm. Dessutom signeras signaturnyckeln med identitetsnyckeln för att skapa en motsignatur.

Attributet AssemblySignatureKeyAttribute gör det möjligt för sammansättningsmetadata att använda den befintliga offentliga nyckeln för sammansättningsidentitet, vilket gör att gamla sammansättningsreferenser kan fortsätta att fungera. Attributet AssemblySignatureKeyAttribute använder motsignaturen för att säkerställa att ägaren till den nya signaturnyckeln också är ägare till den gamla identitetsnyckeln.

Signera med SHA-2, utan nyckelmigrering

Kör följande kommandon från en kommandotolk för att signera en sammansättning utan att migrera en stark namnsignatur:

  1. Generera den nya identitetsnyckeln (om det behövs).

    sn -k IdentityKey.snk  
    
  2. Extrahera den offentliga identitetsnyckeln och ange att en SHA-2-algoritm ska användas vid signering med den här nyckeln.

    sn -p IdentityKey.snk IdentityPubKey.snk sha256  
    
  3. Fördröj signera sammansättningen med den offentliga identitetsnyckelfilen.

    csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+  
    
  4. Signera om sammansättningen med det fullständiga identitetsnyckelparet.

    sn -Ra MyAssembly.exe IdentityKey.snk  
    

Signera med SHA-2 med nyckelmigrering

Kör följande kommandon från en kommandotolk för att signera en sammansättning med en migrerad signatur för starkt namn.

  1. Generera ett identitets- och signaturnyckelpar (om det behövs).

    sn -k IdentityKey.snk  
    sn -k SignatureKey.snk  
    
  2. Extrahera den offentliga signaturnyckeln och ange att en SHA-2-algoritm ska användas vid signering med den här nyckeln.

    sn -p SignatureKey.snk SignaturePubKey.snk sha256  
    
  3. Extrahera den offentliga identitetsnyckeln som avgör hash-algoritmen som genererar en motsignatur.

    sn -p IdentityKey.snk IdentityPubKey.snk  
    
  4. Generera parametrarna för ett AssemblySignatureKeyAttribute attribut och koppla attributet till sammansättningen.

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

    Detta ger utdata som liknar följande.

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

    Dessa utdata kan sedan omvandlas till en AssemblySignatureKeyAttribute.

    [assembly:System.Reflection.AssemblySignatureKeyAttribute(
    "002400000c80000094000000060200000024000052534131000400000100010005a3a81ac0a519d96244a9c589fc147c7d403e40ccf184fc290bdd06c7339389a76b738e255a2bce1d56c3e7e936e4fc87d45adc82ca94c716b50a65d39d373eea033919a613e4341c66863cb2dc622bcb541762b43893434d219d1c43f07e9c83fada2aed400b9f6e44ff05e3ecde6c2827830b8f43f7ac8e3270a34d153cdd",
    "e3cf7c211678c4d1a7b8fb20276c894ab74c29f0b5a34de4d61e63d4a997222f78cdcbfe4c91ebe1ddf9f3505a32edcb2a76f34df0450c4f61e376b70fa3cdeb7374b1b8e2078b121e2ee6e8c6a8ed661cc35621b4af53ac29c9e41738f199a81240e8fd478c887d1a30729d34e954a97cddce66e3ae5fec2c682e57b7442738"
    )]
    
  5. Fördröj signera sammansättningen med den offentliga identitetsnyckeln.

    csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+  
    
  6. Signera sammansättningen fullständigt med signaturnyckelparet.

    sn -Ra MyAssembly.exe SignatureKey.snk  
    

Se även