CA5379: Memastikan algoritma fungsi derivasi kunci cukup kuat

Properti Nilai
ID Aturan CA5379
Judul Pastikan algoritma fungsi derivasi kunci cukup kuat
Kategori Keamanan
Perbaikan bersifat merusak atau tidak merusak Tidak terputus
Diaktifkan secara default di .NET 10 Tidak
Bahasa yang berlaku C# dan Visual Basic

Penyebab

Penggunaan salah satu algoritma berikut saat membuat System.Security.Cryptography.Rfc2898DeriveBytes instans:

Deskripsi aturan

Kelas Rfc2898DeriveBytes secara default menggunakan algoritma SHA1. Saat membuat instance objek Rfc2898DeriveBytes, Anda harus menentukan algoritma hash dari SHA256 atau 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 penggunaan 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);
    }
}