CA5373: Eski anahtar türetme işlevini kullanmayın

Özellik Değer
Kural Kimliği CA5373
Başlık Eski anahtar türetme işlevini kullanmayın
Kategori Güvenlik
Hataya neden olan veya bozulmayan düzeltme Hataya neden olmayan
.NET 8'de varsayılan olarak etkin Hayır

Neden

Şifreleme açısından zayıf anahtar türetme yöntemleri System.Security.Cryptography.PasswordDeriveBytes ve/veya Rfc2898DeriveBytes.CryptDeriveKey anahtar oluşturmak için kullanılır.

Kural açıklaması

Bu kural, zayıf anahtar türetme yöntemleri ve Rfc2898DeriveBytes.CryptDeriveKeyçağrısını algılarSystem.Security.Cryptography.PasswordDeriveBytes. System.Security.Cryptography.PasswordDeriveBytes zayıf bir PBKDF1 algoritması kullandı. Rfc2898DeriveBytes.CryptDeriveKey nesneden yineleme sayısını ve tuzu Rfc2898DeriveBytes kullanmaz ve bu da onu zayıf yapar.

İhlalleri düzeltme

Parola tabanlı anahtar türetmesi, SHA-2 karmasıyla PBKDF2 algoritmasını kullanmalıdır. Rfc2898DeriveBytes.GetBytes bunu başarmak için kullanılabilir.

Uyarıların ne zaman bastırılması gerekiyor?

PBKDF1 kullanımıyla ilgili risk dikkatle gözden geçirilir ve kabul edilirse uyarıyı bastırın.

Uyarıyı gizleme

Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.

#pragma warning disable CA5373
// The code that's violating the rule is on this line.
#pragma warning restore CA5373

Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini noneolarak ayarlayın.

[*.{cs,vb}]
dotnet_diagnostic.CA5373.severity = none

Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.

Sahte kod örnekleri

Ihlal

Bu yazma zamanından itibaren aşağıdaki sahte kod örneği, bu kural tarafından algılanan deseni gösterir.

using System;
using System.Security.Cryptography;
class TestClass
{
    public void TestMethod(Rfc2898DeriveBytes rfc2898DeriveBytes, string algname, string alghashname, int keySize, byte[] rgbIV)
    {
        rfc2898DeriveBytes.CryptDeriveKey(algname, alghashname, keySize, rgbIV);
    }
}

Çözüm

using System;
using System.Security.Cryptography;
class TestClass
{
    public void TestMethod(Rfc2898DeriveBytes rfc2898DeriveBytes)
    {
        rfc2898DeriveBytes.GetBytes(1);
    }
}