Share via


Tanımlayıcı adlandırmayı iyileştirme

Tanımlayıcı ad imzası, derlemeleri tanımlamak için .NET Framework'te bulunan bir kimlik mekanizmasıdır. Genellikle bir kaynaktan (imzalayan) alıcıya (doğrulayıcı) geçirilen verilerin bütünlüğünü doğrulamak için kullanılan ortak anahtar dijital imzasıdır. Bu imza, bir derleme için benzersiz bir kimlik olarak kullanılır ve derlemeye başvuruların belirsiz olmamasını sağlar. Derleme, derleme işleminin bir parçası olarak imzalanır ve yüklendiğinde doğrulanır.

Tanımlayıcı ad imzaları, kötü amaçlı tarafların bir derlemeyle oynamasını ve ardından derlemeyi özgün imzalayanın anahtarıyla yeniden imzalamasını önlemeye yardımcı olur. Ancak, tanımlayıcı ad anahtarları yayımcı hakkında güvenilir bilgi içermez ve sertifika hiyerarşisi içermez. Kesin ad imzası, derlemeyi imzalayan kişinin güvenilirliğini garanti etmez veya o kişinin anahtarın meşru sahibi olup olmadığını belirtmez; yalnızca anahtarın sahibinin derlemeyi imzalandığını gösterir. Bu nedenle, üçüncü taraf koda güvenmek için güvenlik doğrulayıcısı olarak bir tanımlayıcı ad imzası kullanmanızı önermeyiz. Microsoft Authenticode, kodun kimliğini doğrulamanın önerilen yoludur.

Geleneksel tanımlayıcı adların sınırlamaları

.NET Framework 4.5 öncesi sürümlerde kullanılan güçlü adlandırma teknolojisi aşağıdaki eksikliklere sahiptir:

  • Anahtarlar sürekli saldırı altındadır ve geliştirilmiş teknikler ve donanım, ortak anahtardan özel anahtar çıkarabilmek için kolaylık sağlar. Saldırılara karşı korunmak için daha büyük anahtarlar gereklidir. .NET Framework 4.5'in önceki .NET Framework sürümleri, herhangi bir boyut anahtarıyla (varsayılan boyut 1024 bit) oturum açma olanağı sağlar, ancak yeni bir anahtarla derleme imzalamak, derlemenin eski kimliğine başvuran tüm ikili dosyaları bozar. Bu nedenle, uyumluluğu korumak istiyorsanız imzalama anahtarının boyutunu yükseltmek son derece zordur.

  • Tanımlayıcı ad imzalama yalnızca SHA-1 algoritmasını destekler. SHA-1'in yakın zamanda güvenli karma uygulamaları için yetersiz olduğu tespit edildi. Bu nedenle daha güçlü bir algoritma (SHA-256 veya üzeri) gereklidir. SHA-1'in FIPS uyumlu durumunu kaybetmesi mümkündür ve bu da yalnızca FIPS uyumlu yazılım ve algoritmaları kullanmayı seçenler için sorunlara yol açacaktır.

Gelişmiş güçlü adların avantajları

Gelişmiş güçlü adların temel avantajları, önceden var olan tanımlayıcı adlarla uyumluluk ve bir kimliğin diğeriyle eşdeğer olduğunu iddia edebilme özelliğidir:

  • Önceden imzalanmış derlemeleri olan geliştiriciler, eski kimliklere başvuran derlemelerle uyumluluğu korurken kimliklerini SHA-2 algoritmalarına geçirebilir.

  • Yeni derlemeler oluşturan ve önceden var olan tanımlayıcı ad imzalarıyla ilgilenmeyen geliştiriciler daha güvenli SHA-2 algoritmalarını kullanabilir ve derlemeleri her zaman olduğu gibi imzalayabilir.

Gelişmiş tanımlayıcı adlar kullanma

Tanımlayıcı ad anahtarları bir imza anahtarı ve bir kimlik anahtarından oluşur. Derleme imza anahtarıyla imzalanır ve kimlik anahtarı tarafından tanımlanır. .NET Framework 4.5'den önce bu iki anahtar aynıydı. .NET Framework 4.5'den başlayarak, kimlik anahtarı önceki .NET Framework sürümlerinde olduğu gibi kalır, ancak imza anahtarı daha güçlü bir karma algoritmayla geliştirilmiştir. Buna ek olarak, imza anahtarı bir karşı imza oluşturmak için kimlik anahtarıyla imzalanır.

AssemblySignatureKeyAttribute özniteliği, derleme meta verilerinin derleme kimliği için önceden var olan ortak anahtarı kullanmasını sağlar ve bu da eski derleme başvurularının çalışmaya devam etmesini sağlar. özniteliği, AssemblySignatureKeyAttribute yeni imza anahtarının sahibinin aynı zamanda eski kimlik anahtarının da sahibi olduğundan emin olmak için sayaç imzasını kullanır.

Anahtar geçişi olmadan SHA-2 ile oturum açma

Tanımlayıcı ad imzasını geçirmeden bir derlemeyi imzalamak için komut isteminden aşağıdaki komutları çalıştırın:

  1. Yeni kimlik anahtarını oluşturun (gerekirse).

    sn -k IdentityKey.snk  
    
  2. Kimlik ortak anahtarını ayıklayın ve bu anahtarla imzalarken sha-2 algoritmasının kullanılması gerektiğini belirtin.

    sn -p IdentityKey.snk IdentityPubKey.snk sha256  
    
  3. Derlemeyi kimlik ortak anahtar dosyasıyla gecikmeli olarak imzalayın.

    csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+  
    
  4. Derlemeyi tam kimlik anahtarı çiftiyle yeniden imzalayın.

    sn -Ra MyAssembly.exe IdentityKey.snk  
    

Anahtar geçişi ile SHA-2 ile oturum açma

Bir derlemeyi geçirilen tanımlayıcı ad imzası ile imzalamak için bir komut isteminden aşağıdaki komutları çalıştırın.

  1. Bir kimlik ve imza anahtar çifti oluşturun (gerekirse).

    sn -k IdentityKey.snk  
    sn -k SignatureKey.snk  
    
  2. İmza ortak anahtarını ayıklayın ve bu anahtarla imzalarken sha-2 algoritmasının kullanılması gerektiğini belirtin.

    sn -p SignatureKey.snk SignaturePubKey.snk sha256  
    
  3. Bir sayaç imzası oluşturan karma algoritmayı belirleyen kimlik ortak anahtarını ayıklayın.

    sn -p IdentityKey.snk IdentityPubKey.snk  
    
  4. Bir AssemblySignatureKeyAttribute öznitelik için parametreleri oluşturun ve özniteliğini derlemeye ekleyin.

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

    Bu, aşağıdakine benzer bir çıkış oluşturur.

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

    Bu çıkış daha sonra AssemblySignatureKeyAttribute'a dönüştürülebilir.

    [assembly:System.Reflection.AssemblySignatureKeyAttribute(
    "002400000c80000094000000060200000024000052534131000400000100010005a3a81ac0a519d96244a9c589fc147c7d403e40ccf184fc290bdd06c7339389a76b738e255a2bce1d56c3e7e936e4fc87d45adc82ca94c716b50a65d39d373eea033919a613e4341c66863cb2dc622bcb541762b43893434d219d1c43f07e9c83fada2aed400b9f6e44ff05e3ecde6c2827830b8f43f7ac8e3270a34d153cdd",
    "e3cf7c211678c4d1a7b8fb20276c894ab74c29f0b5a34de4d61e63d4a997222f78cdcbfe4c91ebe1ddf9f3505a32edcb2a76f34df0450c4f61e376b70fa3cdeb7374b1b8e2078b121e2ee6e8c6a8ed661cc35621b4af53ac29c9e41738f199a81240e8fd478c887d1a30729d34e954a97cddce66e3ae5fec2c682e57b7442738"
    )]
    
  5. Derlemeyi kimlik ortak anahtarıyla gecikmeli olarak imzalayın.

    csc MyAssembly.cs /keyfile:IdentityPubKey.snk /delaySign+  
    
  6. Derlemeyi imza anahtar çiftiyle tam olarak imzalayın.

    sn -Ra MyAssembly.exe SignatureKey.snk  
    

Ayrıca bkz.