CA5379: Anahtar türetme işlevi algoritmasının yeterince güçlü olduğundan emin olun

Özellik Değer
Kural Kimliği CA5379
Başlık Anahtar türetme işlevi algoritmasının yeterince güçlü olduğundan emin olun
Kategori Güvenlik
Düzeltme bozucu ya da bozmayan olabilir Kesintisiz
.NET 10'da varsayılan olarak etkin Hayır
Geçerli diller C# ve Visual Basic

Neden

System.Security.Cryptography.Rfc2898DeriveBytes örneği oluştururken aşağıdaki algoritmalardan birinin kullanılması:

Kural açıklaması

Rfc2898DeriveBytes sınıfı varsayılan olarak algoritmayı SHA1 kullanır. Bir Rfc2898DeriveBytes nesnesinin örneğini oluştururken SHA256 veya daha yüksek bir karma algoritması belirtmeniz gerekir. Özelliğin yalnızca bir Rfc2898DeriveBytes.HashAlgorithm erişimciye sahip olduğunu get unutmayın.

İhlalleri düzeltme

MD5 veya SHA1 çakışmalara karşı savunmasız olduğundan, Rfc2898DeriveBytes sınıfı için SHA256 veya daha yüksek bir sürümünü kullanın.

.NET Framework veya .NET Core'un eski sürümleri, anahtar türetme işlevi karma algoritması belirtmenize izin vermeyebilir. Bu gibi durumlarda, daha güçlü bir algoritma kullanmak için .NET'in hedef çerçeve sürümünü yükseltmeniz gerekir.

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

Uygulama uyumluluğu nedenleri dışında bu kuralın gizlenmesi önerilmez.

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 CA5379
// The code that's violating the rule is on this line.
#pragma warning restore CA5379

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.CA5379.severity = none

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

Sahte kod örnekleri

Oluşturucu ihlalinde karma algoritmayı belirtme

using System.Security.Cryptography;

class ExampleClass
{
    public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
    {
        var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt, iterations, HashAlgorithmName.MD5);
    }
}

Türetilmiş sınıfın oluşturucu ihlalinde karma algoritma belirtme

using System.Security.Cryptography;

class DerivedClass : Rfc2898DeriveBytes
{
    public DerivedClass (byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm) : base(password, salt, iterations, hashAlgorithm)
    {
    }
}

class ExampleClass
{
    public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
    {
        var derivedClass = new DerivedClass(password, salt, iterations, HashAlgorithmName.MD5);
    }
}

Türetilmiş sınıflarda karma algoritma özelliğini ayarlama ihlali

using System.Security.Cryptography;

class DerivedClass : Rfc2898DeriveBytes
{
    public DerivedClass (byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm) : base(password, salt, iterations, hashAlgorithm)
    {
    }

    public HashAlgorithmName HashAlgorithm { get; set;}
}

class ExampleClass
{
    public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
    {
        var derivedClass = new DerivedClass(password, salt, iterations, HashAlgorithmName.MD5);
        derivedClass.HashAlgorithm = HashAlgorithmName.SHA256;
    }
}

Çözüm

using System.Security.Cryptography;

class ExampleClass
{
    public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
    {
        var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt, iterations, HashAlgorithmName.SHA256);
    }
}