Poprawa silnego nazywania
Podpis silnej nazwy to mechanizm tożsamości w programie .NET Framework do identyfikowania zestawów. Jest to podpis cyfrowy klucza publicznego, który jest zwykle używany do weryfikowania integralności danych przekazywanych z obiektu źródłowego (osoby podpisującej) do adresata (weryfikatora). Ten podpis jest używany jako unikatowa tożsamość zestawu i zapewnia, że odwołania do zestawu nie są niejednoznaczne. Zestaw jest podpisany w ramach procesu kompilacji, a następnie weryfikowany po załadowaniu.
Silne podpisy nazw pomagają zapobiec manipulowaniu przez złośliwe strony zestawem, a następnie ponowne podpisywanie zestawu przy użyciu klucza oryginalnego osoby podpisującego. Jednak klucze silnych nazw nie zawierają żadnych wiarygodnych informacji o wydawcy ani nie zawierają hierarchii certyfikatów. Podpis silnego nazwiska nie gwarantuje wiarygodności osoby, która podpisała zgromadzenie lub wskazuje, czy ta osoba była uzasadnionym właścicielem klucza; wskazuje tylko, że właściciel klucza podpisał zestaw. W związku z tym nie zalecamy używania silnego podpisu nazwy jako modułu sprawdzania poprawności zabezpieczeń do ufania kodowi innej firmy. Microsoft Authenticode to zalecany sposób uwierzytelniania kodu.
Ograniczenia konwencjonalnych silnych nazw
Silna technologia nazewnictwa używana w wersjach przed programem .NET Framework 4.5 ma następujące wady:
Klucze są stale atakowane, a ulepszone techniki i sprzęt ułatwiają wnioskowanie klucza prywatnego z klucza publicznego. Aby chronić przed atakami, konieczne są większe klucze. Wersje programu .NET Framework przed programem .NET Framework 4.5 zapewniają możliwość podpisywania przy użyciu dowolnego klucza rozmiaru (domyślny rozmiar to 1024 bity), ale podpisywanie zestawu przy użyciu nowego klucza powoduje przerwanie wszystkich plików binarnych odwołujących się do starszej tożsamości zestawu. W związku z tym bardzo trudno jest uaktualnić rozmiar klucza podpisywania, jeśli chcesz zachować zgodność.
Podpisywanie silnej nazwy obsługuje tylko algorytm SHA-1. Algorytm SHA-1 został niedawno uznany za nieodpowiedni dla bezpiecznych aplikacji tworzenia skrótów. Dlatego wymagany jest silniejszy algorytm (SHA-256 lub nowszy). Istnieje możliwość, że algorytm SHA-1 utraci pozycję zgodną ze standardem FIPS, co stanowiłoby problemy dla tych, którzy zdecydują się używać tylko oprogramowania i algorytmów zgodnych ze standardem FIPS.
Zalety rozszerzonych silnych nazw
Główne zalety rozszerzonych silnych nazw to zgodność z wcześniej istniejącymi silnymi nazwami i możliwość oświadczenia, że jedna tożsamość jest równoważna innej:
Deweloperzy, którzy mają wstępnie podpisane zestawy, mogą migrować swoje tożsamości do algorytmów SHA-2 przy zachowaniu zgodności z zestawami odwołującymi się do starych tożsamości.
Deweloperzy, którzy tworzą nowe zestawy i nie są zaniepokojeni wcześniej istniejącymi podpisami silnych nazw, mogą używać bezpieczniejszych algorytmów SHA-2 i podpisywać zestawy tak, jak zawsze.
Używanie rozszerzonych silnych nazw
Silne klucze nazw składają się z klucza podpisu i klucza tożsamości. Zestaw jest podpisany przy użyciu klucza podpisu i jest identyfikowany przez klucz tożsamości. Przed programem .NET Framework 4.5 te dwa klucze były identyczne. Począwszy od programu .NET Framework 4.5, klucz tożsamości pozostaje taki sam jak we wcześniejszych wersjach programu .NET Framework, ale klucz podpisu został rozszerzony o silniejszy algorytm skrótu. Ponadto klucz podpisu jest podpisany przy użyciu klucza tożsamości w celu utworzenia sygnatury licznika.
Atrybut AssemblySignatureKeyAttribute umożliwia metadanym zestawu używanie wstępnie istniejącego klucza publicznego dla tożsamości zestawu, co umożliwia kontynuowanie działania starych odwołań do zestawu. Atrybut AssemblySignatureKeyAttribute używa licznika podpisu, aby upewnić się, że właściciel nowego klucza podpisu jest również właścicielem starego klucza tożsamości.
Podpisywanie przy użyciu algorytmu SHA-2 bez migracji klucza
Uruchom następujące polecenia z wiersza polecenia, aby podpisać zestaw bez migrowania podpisu silnej nazwy:
Wygeneruj nowy klucz tożsamości (w razie potrzeby).
sn -k IdentityKey.snk
Wyodrębnij klucz publiczny tożsamości i określ, że algorytm SHA-2 powinien być używany podczas podpisywania przy użyciu tego klucza.
sn -p IdentityKey.snk IdentityPubKey.snk sha256
Opóźnij podpisywanie zestawu przy użyciu pliku klucza publicznego tożsamości.
csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+
Ponownie podpisz zestaw za pomocą pełnej pary kluczy tożsamości.
sn -Ra MyAssembly.exe IdentityKey.snk
Podpisywanie przy użyciu algorytmu SHA-2 z migracją klucza
Uruchom następujące polecenia z poziomu wiersza polecenia, aby podpisać zestaw z migrowanym podpisem silnej nazwy.
Wygeneruj parę tożsamości i klucza podpisu (w razie potrzeby).
sn -k IdentityKey.snk sn -k SignatureKey.snk
Wyodrębnij klucz publiczny podpisu i określ, że algorytm SHA-2 powinien być używany podczas podpisywania przy użyciu tego klucza.
sn -p SignatureKey.snk SignaturePubKey.snk sha256
Wyodrębnij klucz publiczny tożsamości, który określa algorytm wyznaczania wartości skrótu, który generuje podpis licznika.
sn -p IdentityKey.snk IdentityPubKey.snk
Wygeneruj parametry atrybutu AssemblySignatureKeyAttribute i dołącz atrybut do zestawu.
sn -a IdentityPubKey.snk IdentityKey.snk SignaturePubKey.snk
Spowoduje to wygenerowanie danych wyjściowych podobnych do poniższych.
Information for key migration attribute. (System.Reflection.AssemblySignatureKeyAttribute): publicKey= 002400000c80000094000000060200000024000052534131000400000100010005a3a81ac0a519 d96244a9c589fc147c7d403e40ccf184fc290bdd06c7339389a76b738e255a2bce1d56c3e7e936 e4fc87d45adc82ca94c716b50a65d39d373eea033919a613e4341c66863cb2dc622bcb541762b4 3893434d219d1c43f07e9c83fada2aed400b9f6e44ff05e3ecde6c2827830b8f43f7ac8e3270a3 4d153cdd counterSignature= e3cf7c211678c4d1a7b8fb20276c894ab74c29f0b5a34de4d61e63d4a997222f78cdcbfe4c91eb e1ddf9f3505a32edcb2a76f34df0450c4f61e376b70fa3cdeb7374b1b8e2078b121e2ee6e8c6a8 ed661cc35621b4af53ac29c9e41738f199a81240e8fd478c887d1a30729d34e954a97cddce66e3 ae5fec2c682e57b7442738
Te dane wyjściowe można następnie przekształcić w atrybut AssemblySignatureKeyAttribute.
[assembly:System.Reflection.AssemblySignatureKeyAttribute( "002400000c80000094000000060200000024000052534131000400000100010005a3a81ac0a519d96244a9c589fc147c7d403e40ccf184fc290bdd06c7339389a76b738e255a2bce1d56c3e7e936e4fc87d45adc82ca94c716b50a65d39d373eea033919a613e4341c66863cb2dc622bcb541762b43893434d219d1c43f07e9c83fada2aed400b9f6e44ff05e3ecde6c2827830b8f43f7ac8e3270a34d153cdd", "e3cf7c211678c4d1a7b8fb20276c894ab74c29f0b5a34de4d61e63d4a997222f78cdcbfe4c91ebe1ddf9f3505a32edcb2a76f34df0450c4f61e376b70fa3cdeb7374b1b8e2078b121e2ee6e8c6a8ed661cc35621b4af53ac29c9e41738f199a81240e8fd478c887d1a30729d34e954a97cddce66e3ae5fec2c682e57b7442738" )]
Opóźnij podpisywanie zestawu przy użyciu klucza publicznego tożsamości.
csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+
W pełni podpisz zestaw za pomocą pary kluczy podpisu.
sn -Ra MyAssembly.exe SignatureKey.snk