CA5390: Keine Hartcodierung von Verschlüsselungsschlüsseln
Eigenschaft | Wert |
---|---|
Regel-ID | CA5390 |
Titel | Keine Hartcodierung von Verschlüsselungsschlüsseln |
Kategorie | Security |
Fix führt oder führt nicht zur Unterbrechung | Nicht unterbrechend |
Standardmäßig in .NET 8 aktiviert | Nein |
Ursache
Der key
-Parameter des System.Security.Cryptography.AesCcm- oder System.Security.Cryptography.AesGcm-Konstruktors, System.Security.Cryptography.SymmetricAlgorithm.Key-Eigenschaft oder der rgbKey
- Parameter der System.Security.Cryptography.SymmetricAlgorithm.CreateEncryptor- oder System.Security.Cryptography.SymmetricAlgorithm.CreateDecryptor-Methode ist mit einem der folgenden Methoden hart codiert:
- Bytearray.
- System.Convert.FromBase64String.
- Alle Überladungen von System.Text.Encoding.GetBytes.
Standardmäßig analysiert diese Regel die gesamte Codebasis, aber dieses Verhalten ist konfigurierbar.
Regelbeschreibung
Damit ein symmetrischer Algorithmus funktioniert, darf der geheime Schlüssel nur dem Absender und dem Empfänger bekannt sein. Wenn ein Schlüssel hart codiert wird, lässt er sich leicht entdecken. Selbst aus kompilierten Binärdateien kann er von böswilligen Benutzern ganz einfach extrahiert werden. Sobald der private Schlüssel aufgedeckt wurde, kann der Verschlüsselungstext direkt entschlüsselt werden und ist nicht mehr geschützt.
Behandeln von Verstößen
- Sie sollten Ihre Anwendung so umgestalten, dass Sie ein sicheres Schlüssel-Verwaltungssystem wie Azure Key Vault verwendet.
- Behalten Sie die Anmeldeinformationen und Schlüssel an einem sicheren Ort vor, der von Ihrem Quellcode getrennt ist.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie keine Warnung dieser Regel.
Konfigurieren des zu analysierenden Codes
Mithilfe der folgenden Optionen können Sie konfigurieren, für welche Teile Ihrer Codebasis diese Regel ausgeführt werden soll.
Sie können diese Optionen nur für diese Regel, für alle zutreffenden Regeln oder für alle zutreffenden Regeln in dieser Kategorie (Sicherheit) konfigurieren. Weitere Informationen finden Sie unter Konfigurationsoptionen für die Codequalitätsregel.
Ausschließen bestimmter Symbole
Sie können bestimmte Symbole, z. B. Typen und Methoden, von der Analyse ausschließen. Sie können beispielsweise festlegen, dass die Regel nicht für Code innerhalb von Typen namens MyType
ausgeführt werden soll, indem Sie einer EDITORCONFIG-Datei in Ihrem Projekt das folgende Schlüssel-Wert-Paar hinzufügen:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Zulässige Formate für Symbolnamen im Optionswert (durch |
getrennt):
- Nur Symbolname (schließt alle Symbole mit dem Namen ein, unabhängig vom enthaltenden Typ oder Namespace)
- Vollqualifizierte Namen im Format der Dokumentations-ID des Symbols Jeder Symbolname erfordert ein Symbolartpräfix, z. B.
M:
für Methoden,T:
für Typen undN:
für Namespaces. .ctor
für Konstruktoren und.cctor
für statische Konstruktoren
Beispiele:
Optionswert | Zusammenfassung |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Trifft auf alle Symbole namens MyType zu |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Trifft auf alle Symbole namens MyType1 oder MyType2 zu |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Trifft speziell auf die Methode MyMethod mit der angegebenen vollqualifizierten Signatur zu |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Trifft speziell auf die Methoden MyMethod1 und MyMethod2 mit den jeweiligen vollqualifizierten Signaturen zu |
Ausschließen bestimmter Typen und von diesen abgeleiteten Typen
Sie können bestimmte Typen und von diesen abgeleitete Typen aus der Analyse ausschließen. Wenn Sie z. B. festlegen möchten, dass die Regel nicht für Methoden innerhalb von MyType
-Typen und von diesen abgeleiteten Typen ausgeführt werden soll, fügen Sie einer EDITORCONFIG-Datei in Ihrem Projekt das folgende Schlüssel-Wert-Paar hinzu:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Zulässige Formate für Symbolnamen im Optionswert (durch |
getrennt):
- Nur Typname (schließt alle Typen mit dem Namen ein, unabhängig vom enthaltenden Typ oder Namespace)
- Vollqualifizierte Namen im Dokumentations-ID-Format des Symbols mit einem optionalen Präfix
T:
Beispiele:
Optionswert | Zusammenfassung |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Stimmt mit allen MyType -Typen und allen von diesen abgeleiteten Typen überein. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Stimmt mit allen MyType1 - oder MyType2 -Typen und allen von diesen abgeleiteten Typen überein. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Stimmt mit einem bestimmten MyType -Typ mit einem angegebenen vollqualifizierten Namen und allen von diesem abgeleiteten Typen überein. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Stimmt mit bestimmten MyType1 - und MyType2 -Typen mit den entsprechenden vollqualifizierten Namen und allen von diesen abgeleiteten Typen überein. |
Pseudocodebeispiele
Verletzung eines hart codierten Bytearrays
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);
}
}
Hart codierte Convert.FromBase64String-Verletzung
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);
}
}
Hart codierte Encoding.GetBytes-Verletzung
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);
}
}
Lösung
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);
}
}