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 9'da varsayılan olarak etkin | Hayır |
Neden
Örneği oluştururken System.Security.Cryptography.Rfc2898DeriveBytesaşağıdaki algoritmalardan birinin kullanılması:
- System.Security.Cryptography.MD5
- System.Security.Cryptography.SHA1
- Kuralın derleme zamanında belirleyemediğini bir algoritma
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 Rfc2898DeriveBytes.HashAlgorithm erişimciye sahip olduğunu get
unutmayın.
İhlalleri düzeltme
MD5 Veya SHA1 çakışmalara karşı savunmasız olduğundan, sınıfı için veya üzerini SHA256 kullanınRfc2898DeriveBytes.
.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 none
olarak 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);
}
}