CA5379: Memastikan algoritma fungsi derivasi kunci cukup kuat
Properti | Nilai |
---|---|
ID Aturan | CA5379 |
Judul | Pastikan algoritma fungsi derivasi kunci cukup kuat |
Golongan | Keamanan |
Perbaikan bersifat disruptif atau non-disruptif | Non-disruptif |
Diaktifkan secara default di .NET 9 | No |
Penyebab
Penggunaan salah satu algoritma berikut saat membuat System.Security.Cryptography.Rfc2898DeriveBytesinstans :
- System.Security.Cryptography.MD5
- System.Security.Cryptography.SHA1
- Algoritma yang tidak dapat ditentukan aturan pada waktu kompilasi
Deskripsi aturan
Kelas Rfc2898DeriveBytes default menggunakan algoritma SHA1. Saat membuat Rfc2898DeriveBytes instans objek, Anda harus menentukan algoritma hash atau yang SHA256 lebih tinggi. Perhatikan bahwa Rfc2898DeriveBytes.HashAlgorithm properti hanya memiliki get
aksesor.
Cara memperbaiki pelanggaran
Karena MD5 atau SHA1 rentan terhadap tabrakan, gunakan SHA256 atau lebih tinggi untuk kelas .Rfc2898DeriveBytes
Versi lama .NET Framework atau .NET Core mungkin tidak memungkinkan Anda menentukan algoritma hash fungsi derivasi kunci. Dalam kasus seperti itu, Anda perlu meningkatkan versi kerangka kerja target .NET untuk menggunakan algoritma yang lebih kuat.
Kapan harus menekan peringatan
Tidak disarankan untuk menekan aturan ini kecuali untuk alasan kompatibilitas aplikasi.
Menyembunyikan peringatan
Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.
#pragma warning disable CA5379
// The code that's violating the rule is on this line.
#pragma warning restore CA5379
Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none
dalam file konfigurasi.
[*.{cs,vb}]
dotnet_diagnostic.CA5379.severity = none
Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.
Contoh kode semu
Tentukan algoritma hash dalam pelanggaran konstruktor
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);
}
}
Tentukan algoritma hash dalam pelanggaran konstruktor kelas turunan
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);
}
}
Mengatur properti algoritma hash dalam pelanggaran kelas turunan
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;
}
}
Solusi
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);
}
}