Bagikan melalui


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 8 Tidak

Penyebab

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

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