Verbeterde sterke naamgeving
Een sterke naamhandtekening is een identiteitsmechanisme in .NET Framework voor het identificeren van assembly's. Het is een digitale handtekening met een openbare sleutel die doorgaans wordt gebruikt om de integriteit te verifiëren van gegevens die worden doorgegeven van een originator (ondertekenaar) aan een ontvanger (verificator). Deze handtekening wordt gebruikt als een unieke identiteit voor een assembly en zorgt ervoor dat verwijzingen naar de assembly niet dubbelzinnig zijn. De assembly wordt ondertekend als onderdeel van het buildproces en wordt vervolgens gecontroleerd wanneer deze wordt geladen.
Sterke naamhandtekeningen helpen voorkomen dat kwaadwillende partijen knoeien met een assembly en de assembly vervolgens opnieuw ondertekenen met de sleutel van de oorspronkelijke ondertekenaar. Sterke naamsleutels bevatten echter geen betrouwbare informatie over de uitgever en bevatten ook geen certificaathiërarchie. Een sterke naamhandtekening garandeert niet de betrouwbaarheid van de persoon die de assembly heeft ondertekend of geeft aan of die persoon een legitieme eigenaar van de sleutel was; hiermee wordt alleen aangegeven dat de eigenaar van de sleutel de assembly heeft ondertekend. Daarom raden we het gebruik van een sterke naamhandtekening niet aan als een beveiligingsvalidator voor het vertrouwen van code van derden. Microsoft Authenticode is de aanbevolen manier om code te verifiëren.
Beperkingen van conventionele sterke namen
De sterke naamgevingstechnologie die wordt gebruikt in versies voordat .NET Framework 4.5 de volgende tekortkomingen heeft:
Sleutels worden voortdurend aangevallen en verbeterde technieken en hardware maken het gemakkelijker om een persoonlijke sleutel van een openbare sleutel af te leggen. Om te voorkomen dat aanvallen worden uitgevoerd, zijn grotere sleutels nodig. .NET Framework-versies vóór .NET Framework 4.5 bieden de mogelijkheid om te ondertekenen met een willekeurige groottesleutel (de standaardgrootte is 1024 bits), maar het ondertekenen van een assembly met een nieuwe sleutel breekt alle binaire bestanden die verwijzen naar de oudere identiteit van de assembly. Daarom is het zeer moeilijk om de grootte van een ondertekeningssleutel bij te werken als u compatibiliteit wilt behouden.
Sterke naamondertekening ondersteunt alleen het SHA-1-algoritme. SHA-1 is onlangs gebleken dat het onvoldoende is voor veilige hashingtoepassingen. Daarom is een sterker algoritme (SHA-256 of hoger) nodig. Het is mogelijk dat SHA-1 de FIPS-compatibele status verliest, wat problemen zou opleveren voor degenen die ervoor kiezen om alleen FIPS-compatibele software en algoritmen te gebruiken.
Voordelen van verbeterde sterke namen
De belangrijkste voordelen van verbeterde sterke namen zijn compatibiliteit met bestaande sterke namen en de mogelijkheid om te claimen dat één identiteit gelijk is aan een andere:
Ontwikkelaars die al bestaande ondertekende assembly's hebben, kunnen hun identiteiten migreren naar de SHA-2-algoritmen, terwijl compatibiliteit met assembly's wordt gehandhaafd die verwijzen naar de oude identiteiten.
Ontwikkelaars die nieuwe assembly's maken en niet betrokken zijn bij bestaande sterke naamhandtekeningen, kunnen de veiligere SHA-2-algoritmen gebruiken en de assembly's ondertekenen zoals ze altijd hebben.
Verbeterde sterke namen gebruiken
Sterke naamsleutels bestaan uit een handtekeningsleutel en een identiteitssleutel. De assembly wordt ondertekend met de handtekeningsleutel en wordt geïdentificeerd door de identiteitssleutel. Vóór .NET Framework 4.5 waren deze twee sleutels identiek. Vanaf .NET Framework 4.5 blijft de identiteitssleutel hetzelfde als in eerdere versies van .NET Framework, maar de handtekeningsleutel wordt uitgebreid met een sterker hash-algoritme. Daarnaast wordt de handtekeningsleutel ondertekend met de identiteitssleutel om een tegenhandtekening te maken.
Met AssemblySignatureKeyAttribute het kenmerk kunnen de metagegevens van de assembly de bestaande openbare sleutel voor assembly-identiteit gebruiken, waardoor oude assemblyverwijzingen kunnen blijven werken. Het AssemblySignatureKeyAttribute kenmerk gebruikt de tegenhandtekening om ervoor te zorgen dat de eigenaar van de nieuwe handtekeningsleutel ook de eigenaar is van de oude identiteitssleutel.
Aanmelden met SHA-2, zonder sleutelmigratie
Voer de volgende opdrachten uit vanaf een opdrachtprompt om een assembly te ondertekenen zonder een sterke naamhandtekening te migreren:
Genereer de nieuwe identiteitssleutel (indien nodig).
sn -k IdentityKey.snk
Pak de openbare identiteitssleutel uit en geef op dat een SHA-2-algoritme moet worden gebruikt bij het ondertekenen met deze sleutel.
sn -p IdentityKey.snk IdentityPubKey.snk sha256
Teken de assembly uit met het openbare-sleutelbestand van de identiteit.
csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+
Onderteken de assembly opnieuw met het volledige identiteitssleutelpaar.
sn -Ra MyAssembly.exe IdentityKey.snk
Aanmelden met SHA-2, met sleutelmigratie
Voer de volgende opdrachten uit vanaf een opdrachtprompt om een assembly te ondertekenen met een gemigreerde sterke naamhandtekening.
Genereer een identiteits- en handtekeningsleutelpaar (indien nodig).
sn -k IdentityKey.snk sn -k SignatureKey.snk
Pak de openbare handtekeningsleutel uit en geef op dat een SHA-2-algoritme moet worden gebruikt bij het ondertekenen met deze sleutel.
sn -p SignatureKey.snk SignaturePubKey.snk sha256
Pak de openbare identiteitssleutel uit, waarmee het hash-algoritme wordt bepaald waarmee een tegenhandtekening wordt gegenereerd.
sn -p IdentityKey.snk IdentityPubKey.snk
Genereer de parameters voor een AssemblySignatureKeyAttribute kenmerk en koppel het kenmerk aan de assembly.
sn -a IdentityPubKey.snk IdentityKey.snk SignaturePubKey.snk
Dit produceert uitvoer die vergelijkbaar is met de volgende.
Information for key migration attribute. (System.Reflection.AssemblySignatureKeyAttribute): publicKey= 002400000c80000094000000060200000024000052534131000400000100010005a3a81ac0a519 d96244a9c589fc147c7d403e40ccf184fc290bdd06c7339389a76b738e255a2bce1d56c3e7e936 e4fc87d45adc82ca94c716b50a65d39d373eea033919a613e4341c66863cb2dc622bcb541762b4 3893434d219d1c43f07e9c83fada2aed400b9f6e44ff05e3ecde6c2827830b8f43f7ac8e3270a3 4d153cdd counterSignature= e3cf7c211678c4d1a7b8fb20276c894ab74c29f0b5a34de4d61e63d4a997222f78cdcbfe4c91eb e1ddf9f3505a32edcb2a76f34df0450c4f61e376b70fa3cdeb7374b1b8e2078b121e2ee6e8c6a8 ed661cc35621b4af53ac29c9e41738f199a81240e8fd478c887d1a30729d34e954a97cddce66e3 ae5fec2c682e57b7442738
Deze uitvoer kan vervolgens worden omgezet in een AssemblySignatureKeyAttribute.
[assembly:System.Reflection.AssemblySignatureKeyAttribute( "002400000c80000094000000060200000024000052534131000400000100010005a3a81ac0a519d96244a9c589fc147c7d403e40ccf184fc290bdd06c7339389a76b738e255a2bce1d56c3e7e936e4fc87d45adc82ca94c716b50a65d39d373eea033919a613e4341c66863cb2dc622bcb541762b43893434d219d1c43f07e9c83fada2aed400b9f6e44ff05e3ecde6c2827830b8f43f7ac8e3270a34d153cdd", "e3cf7c211678c4d1a7b8fb20276c894ab74c29f0b5a34de4d61e63d4a997222f78cdcbfe4c91ebe1ddf9f3505a32edcb2a76f34df0450c4f61e376b70fa3cdeb7374b1b8e2078b121e2ee6e8c6a8ed661cc35621b4af53ac29c9e41738f199a81240e8fd478c887d1a30729d34e954a97cddce66e3ae5fec2c682e57b7442738" )]
Teken de assembly uit met de openbare sleutel van de identiteit.
csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+
De assembly volledig ondertekenen met het handtekeningsleutelpaar.
sn -Ra MyAssembly.exe SignatureKey.snk