Aracılığıyla paylaş


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
Hataya neden olan veya bozulmayan düzeltme Hataya neden olmayan
.NET 8'de varsayılan olarak etkin Hayır

Neden

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

Kural açıklaması

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

İhlalleri düzeltme

SHA1 Veya MD5 çakışmalara karşı savunmasız olduğundan, sınıfı için veya üzerini Rfc2898DeriveBytes kullanınSHA256.

.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);
    }
}