Share via


Şifreleme soyutlamalarının varsayılan uygulamalarının örneklenmesi desteklenmez

Şifreleme soyutlamalarında parametresiz Create() aşırı yüklemeler .NET 5.0'dan itibaren uyarı olarak kullanım dışıdır.

Açıklama değiştirildi

.NET Framework 2.0 - 4.8'de, gibi HashAlgorithm.Create() soyut şifreleme temel fabrikaları farklı algoritmalar döndürecek şekilde yapılandırılabilir. Örneğin, .NET Framework 4.8'in varsayılan yüklemesinde, parametresiz, statik yöntem HashAlgorithm.Create() aşağıdaki kod parçacığında gösterildiği gibi SHA1 algoritmasının bir örneğini döndürür.

Yalnızca .NET Framework

// Return an instance of the default hash algorithm (SHA1).
HashAlgorithm alg = HashAlgorithm.Create();
// Prints 'System.Security.Cryptography.SHA1CryptoServiceProvider'.
Console.WriteLine(alg.GetType());

// Change the default algorithm to be SHA256, not SHA1.
CryptoConfig.AddAlgorithm(typeof(SHA256CryptoServiceProvider), typeof(HashAlgorithm).FullName);
alg = HashAlgorithm.Create();
// Prints 'System.Security.Cryptography.SHA256CryptoServiceProvider'.
Console.WriteLine(alg.GetType());

Ayrıca, program aracılığıyla çağrısı CryptoConfig yapmanıza gerek kalmadan varsayılan algoritmayı değiştirmek için makine genelinde yapılandırmayı da kullanabilirsiniz.

.NET Core 2.0 - 3.1'de, her zaman gibi soyut şifreleme temel fabrikaları HashAlgorithm.Create() oluşturur PlatformNotSupportedException.

// Throws PlatformNotSupportedException on .NET Core.
HashAlgorithm alg = HashAlgorithm.Create();

.NET 5 ve sonraki sürümlerinde, gibi HashAlgorithm.Create() soyut şifreleme temel fabrikaları eski olarak işaretlenir ve kimliğiyle SYSLIB0007derleme zamanı uyarısı oluşturur. Çalışma zamanında, bu yöntemler bir PlatformNotSupportedExceptionatmaya devam eder.

// Throws PlatformNotSupportedException.
// Also produces compile-time warning SYSLIB0007 on .NET 5+.
HashAlgorithm alg = HashAlgorithm.Create();

Bu yalnızca derleme zamanı değişikliğidir. .NET Core'un önceki sürümlerinde çalışma zamanı değişikliği yoktur.

Not

  • Yalnızca yöntemlerin Create() parametresiz aşırı yüklemeleri eskidir. Parametreli aşırı yüklemeler eski değildir ve yine de beklendiği gibi çalışır.

    // Call Create(string), providing an explicit algorithm family name.
    // Works in .NET Framework, .NET Core, and .NET 5+.
    HashAlgorithm hashAlg = HashAlgorithm.Create("SHA256");
    
  • Belirli algoritma ailelerinin parametresiz aşırı yüklemeleri (soyutlamalar değil) eski değildir ve beklendiği gibi çalışmaya devam eder.

    // Call a specific algorithm family's parameterless Create() ctor.
    // Works in .NET Framework, .NET Core, and .NET 5+.
    Aes aesAlg = Aes.Create();
    

Değişiklik nedeni

.NET Framework'te mevcut olan şifreleme yapılandırma sistemi artık .NET Core ve .NET 5+'ta mevcut değildir, çünkü bu eski sistem düzgün şifreleme çevikliği sağlamaz. . NET'in geriye dönük uyumluluk gereksinimleri, çerçevenin şifrelemedeki ilerlemelere ayak uydurmak için belirli şifreleme API'lerini güncelleştirmesini de yasaklar. Örneğin, HashAlgorithm.Create() yöntemi SHA-1 karma algoritması en son sürüm olduğunda .NET Framework 1.0'da kullanıma sunulmuştur. Yirmi yıl geçti ve şimdi SHA-1 bozuk olarak kabul edilir, ancak farklı bir algoritma döndürmek için değiştiremeyiz HashAlgorithm.Create() . Bunun yapılması, uygulamaların tüketilmesinde kabul edilemez bir hataya neden olur.

En iyi yöntem, şifreleme temel öğelerini (AES, SHA-* ve RSA gibi) kullanan kitaplıkların bu temel öğeleri nasıl kullandıkları üzerinde tam denetime sahip olması gerektiğini belirler. Gelecekte yazım denetleme gerektiren uygulamalar, bu temel bilgileri sarmalayan ve anahtar yönetimi ve şifreleme çevikliği özellikleri ekleyen daha üst düzey kitaplıklar kullanmalıdır. Bu kitaplıklar genellikle barındırma ortamı tarafından sağlanır. Örneklerden biri ASP'dir . Bu endişeleri çağıran uygulama adına işleyen NET'in Data Protection kitaplığı.

Sürüm kullanıma sunulmuştur

5.0

  • Önerilen eylem, artık kullanılmayan API'lere yapılan çağrıları, örneğin Aes.Create()belirli algoritmalar için fabrika yöntemlerine yapılan çağrılarla değiştirmektir. Bu, hangi algoritmaların örneklendiği üzerinde tam denetim sağlar.

  • Artık kullanılmayan API'leri kullanan .NET Framework uygulamaları tarafından oluşturulan mevcut yüklerle uyumluluğu sürdürmeniz gerekiyorsa, aşağıdaki tabloda önerilen değişiklikleri kullanın. Tablo, .NET Framework varsayılan algoritmalarından .NET 5+ eşdeğerlerine eşleme sağlar.

    .NET Framework .NET Core / .NET 5+ uyumlu değiştirme Açıklamalar
    AsymmetricAlgorithm.Create() RSA.Create()
    HashAlgorithm.Create() SHA1.Create() SHA-1 algoritması bozuk olarak kabul edilir. Mümkünse daha güçlü bir algoritma kullanmayı göz önünde bulundurun. Daha fazla rehberlik için güvenlik danışmanınıza başvurun.
    HMAC.Create() HMACSHA1() çoğu modern uygulama için HMACSHA1 algoritması önerilmez. Mümkünse daha güçlü bir algoritma kullanmayı göz önünde bulundurun. Daha fazla rehberlik için güvenlik danışmanınıza başvurun.
    KeyedHashAlgorithm.Create() HMACSHA1() çoğu modern uygulama için HMACSHA1 algoritması önerilmez. Mümkünse daha güçlü bir algoritma kullanmayı göz önünde bulundurun. Daha fazla rehberlik için güvenlik danışmanınıza başvurun.
    SymmetricAlgorithm.Create() Aes.Create()
  • Eski parametresiz Create() aşırı yüklemeleri çağırmaya devam etmeniz gerekiyorsa, kodda uyarıyı SYSLIB0007 gizleyebilirsiniz.

    #pragma warning disable SYSLIB0007 // Disable the warning.
    HashAlgorithm alg = HashAlgorithm.Create(); // Still throws PNSE.
    #pragma warning restore SYSLIB0007 // Re-enable the warning.
    

    Uyarıyı proje dosyanızda da gizleyebilirsiniz. Bunun yapılması, projedeki tüm kaynak dosyalar için uyarıyı devre dışı bırakır.

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
       <TargetFramework>net5.0</TargetFramework>
       <!-- NoWarn below suppresses SYSLIB0007 project-wide -->
       <NoWarn>$(NoWarn);SYSLIB0007</NoWarn>
      </PropertyGroup>
    </Project>
    

    Not

    SYSLIB0007 Gizleme yalnızca burada listelenen şifreleme API'leri için kullanımdan kaldırılan uyarıları devre dışı bırakır. Diğer uyarıları devre dışı bırakmaz. Ayrıca, uyarıyı bastırsanız bile, bu engellenen API'ler çalışma zamanında yine de bir PlatformNotSupportedException oluşturur.

Etkilenen API’ler