Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
| Properti | Nilai |
|---|---|
| ID Aturan | CA5390 |
| Judul | Jangan kode keras kunci enkripsi |
| 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
Parameter key dari konstruktor System.Security.Cryptography.AesCcm atau System.Security.Cryptography.AesGcm, properti System.Security.Cryptography.SymmetricAlgorithm.Key, atau parameter rgbKey dari metode System.Security.Cryptography.SymmetricAlgorithm.CreateEncryptor atau System.Security.Cryptography.SymmetricAlgorithm.CreateDecryptor dihardcode oleh salah satu dari berikut:
- Array bita
- System.Convert.FromBase64String.
- Semua kelebihan beban System.Text.Encoding.GetBytes.
Secara default, aturan ini menganalisis seluruh codebase, tetapi ini dapat dikonfigurasi.
Deskripsi aturan
Agar algoritma simetris berhasil, kunci rahasia harus diketahui hanya oleh pengirim dan penerima. Ketika kunci dikodekan secara permanen, kunci akan menjadi mudah ditemukan. Bahkan dengan biner yang dikompilasi, mudah bagi pengguna berbahaya untuk mengekstraknya. Setelah kunci privat disusupi, teks cipher dapat didekripsi secara langsung dan tidak dilindungi lagi.
Cara memperbaiki pelanggaran
- Pertimbangkan untuk mendesain ulang aplikasi Anda untuk menggunakan sistem manajemen kunci yang aman, seperti Azure Key Vault.
- Pertahankan kredensial dan kunci di lokasi yang aman terpisah dari kode sumber Anda.
Kapan harus menekan peringatan
Jangan menyembunyikan peringatan dari aturan ini.
Mengonfigurasi kode yang akan dianalisis
Gunakan opsi berikut untuk mengonfigurasi bagian mana dari codebase Anda yang akan menjalankan aturan ini.
Anda dapat mengonfigurasi opsi ini hanya untuk aturan ini, untuk semua aturan yang dikenakan, atau untuk semua aturan dalam kategori Keamanan yang dikenakan. Untuk informasi selengkapnya, lihat Opsi konfigurasi aturan kualitas kode.
Mengecualikan simbol tertentu
Anda dapat mengecualikan simbol tertentu, seperti jenis dan metode, dari analisis dengan mengatur opsi excluded_symbol_names. Misalnya, untuk menentukan bahwa aturan tidak boleh berjalan pada kode apa pun dalam jenis bernama MyType, tambahkan pasangan kunci-nilai berikut ke file .editorconfig di proyek Anda:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Nota
Ganti bagian XXXXCAXXXX dengan ID aturan yang berlaku.
Format nama simbol yang diizinkan pada nilai opsi (dipisahkan oleh |):
- Nama simbol saja (menyertakan semua simbol dengan nama, terlepas dari jenis atau namespace yang memuatnya).
- Nama yang sepenuhnya memenuhi syarat dalam format ID dokumentasi simbol. Setiap nama simbol memerlukan awalan jenis simbol, seperti
M:untuk metode,T:untuk jenis, danN:untuk namespace. -
.ctoruntuk konstruktor dan.cctoruntuk konstruktor statik.
Contoh:
| Nilai Opsi | Ringkasan |
|---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Mencocokkan semua simbol bernama MyType. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Mencocokkan semua simbol bernama MyType1 atau MyType2. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Mencocokkan metode tertentu MyMethod dengan tanda tangan memenuhi syarat penuh yang ditentukan. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Mencocokkan metode tertentu MyMethod1 dan MyMethod2 dengan tanda tangan lengkap masing-masing. |
Mengecualikan jenis tertentu dan jenis turunannya
Anda dapat mengecualikan jenis tertentu dan jenis turunannya dari analisis dengan mengatur opsi excluded_type_names_with_derived_types. Misalnya, untuk menentukan bahwa aturan tidak boleh dijalankan pada metode apa pun dalam jenis bernama MyType dan jenis turunannya, tambahkan pasangan kunci-nilai berikut ke file .editorconfig di proyek Anda:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Nota
Ganti bagian XXXXCAXXXX dengan ID aturan yang berlaku.
Format nama simbol yang diizinkan pada nilai opsi (dipisahkan oleh |):
- Nama jenis saja (mencakup semua jenis dengan nama, terlepas dari jenis atau namespace yang memuatnya).
- Nama yang sepenuhnya dikualifikasi dalam format ID dokumentasi simbol, dengan awalan
T:yang bersifat opsional.
Contoh:
| Nilai opsi | Ringkasan |
|---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Mencocokkan semua jenis bernama MyType dan semua jenis turunannya. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Mencocokkan semua jenis bernama MyType1 atau MyType2 dan semua jenis turunannya. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Mencocokkan jenis tertentu MyType dengan nama lengkap yang diberikan dan semua jenis turunannya. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Mencocokkan jenis tertentu MyType1 dan MyType2 dengan nama lengkap yang memenuhi syarat, serta semua jenis turunannya. |
Contoh kode semu
Pelanggaran array byte yang dikodekan langsung
using System;
using System.Security.Cryptography;
class ExampleClass
{
public void ExampleMethod(byte[] someOtherBytesForIV)
{
byte[] rgbKey = new byte[] {1, 2, 3};
SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();
rijn.CreateEncryptor(rgbKey, someOtherBytesForIV);
}
}
Pelanggaran Convert.FromBase64String yang dikodekan secara permanen
using System;
using System.Security.Cryptography;
class ExampleClass
{
public void ExampleMethod(byte[] someOtherBytesForIV)
{
byte[] key = Convert.FromBase64String("AAAAAaazaoensuth");
SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();
rijn.CreateEncryptor(key, someOtherBytesForIV);
}
}
Pelanggaran Encoding.GetBytes yang diprogramkan secara tetap
using System.Text;
using System.Security.Cryptography;
class ExampleClass
{
public void ExampleMethod(byte[] someOtherBytesForIV)
{
byte[] key = Encoding.ASCII.GetBytes("AAAAAaazaoensuth");
SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();
rijn.CreateEncryptor(key, someOtherBytesForIV);
}
}
Solusi
using System.Text;
using System.Security.Cryptography;
class ExampleClass
{
public void ExampleMethod(char[] chars, byte[] someOtherBytesForIV)
{
byte[] key = Encoding.ASCII.GetBytes(chars);
SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();
rijn.CreateEncryptor(key, someOtherBytesForIV);
}
}