CA5390: 암호화 키를 하드 코드하지 마세요.
속성 | 값 |
---|---|
규칙 ID | CA5390 |
타이틀 | 암호화 키를 하드 코딩하지 마세요. |
범주 | 보안 |
수정 사항이 주요 변경인지 여부 | 주요 변경 아님 |
.NET 8에서 기본적으로 사용 | 아니요 |
원인
System.Security.Cryptography.AesCcm 또는 System.Security.Cryptography.AesGcm 생성자의 key
매개 변수, System.Security.Cryptography.SymmetricAlgorithm.Key 속성, System.Security.Cryptography.SymmetricAlgorithm.CreateEncryptor 또는 System.Security.Cryptography.SymmetricAlgorithm.CreateDecryptor 메서드의 rgbKey
매개 변수가 다음 중 하나로 하드 코드됩니다.
- 바이트 배열
- System.Convert.FromBase64String.
- System.Text.Encoding.GetBytes의 모든 오버로드
기본적으로 이 규칙은 전체 코드베이스를 분석하지만 이는 구성 가능합니다.
규칙 설명
대칭 알고리즘이 성공하려면 비밀 키가 발신자와 수신자에게만 알려져야 합니다. 키가 하드 코드되면 쉽게 검색됩니다. 컴파일된 이진 파일인 경우에도 악의적인 사용자가 쉽게 추출할 수 있습니다. 프라이빗 키가 손상되면 암호화 텍스트를 직접 암호 해독할 수 있으며 더 이상 보호되지 않습니다.
위반 문제를 해결하는 방법
- Azure Key Vault와 같은 보안 키 관리 시스템을 사용하도록 애플리케이션을 다시 설계하는 것이 좋습니다.
- 소스 코드와 별도로 안전한 위치에 자격 증명과 키를 보관합니다.
경고를 표시하지 않는 경우
이 규칙에서는 경고를 표시해야 합니다.
분석할 코드 구성
다음 옵션을 사용하여 이 규칙이 실행될 코드베이스 부분을 구성합니다.
이 규칙, 적용되는 모든 규칙 또는 적용되는 이 범주(보안)의 모든 규칙에 대해 이러한 옵션을 구성할 수 있습니다. 자세한 내용은 코드 품질 규칙 구성 옵션을 참조하세요.
특정 기호 제외
분석에서 형식 및 메서드와 같은 특정 기호를 제외할 수 있습니다. 예를 들어 MyType
이라는 형식 내 코드에서 규칙을 실행하지 않도록 지정하려면 프로젝트의 .editorconfig 파일에 다음 키-값 쌍을 추가합니다.
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
옵션 값의 허용되는 기호 이름 형식(|
로 구분):
- 기호 이름만(포함하는 형식 또는 네임스페이스와 관계없이 해당 이름의 모든 기호 포함).
- 기호의 설명서 ID 형식에 있는 정규화된 이름. 각 기호 이름에는 메서드의 경우
M:
, 형식의 경우T:
, 네임스페이스의 경우N:
과 같은 기호 종류 접두사가 필요합니다. - 생성자의 경우
.ctor
이고 정적 생성자의 경우.cctor
입니다.
예:
옵션 값 | 요약 |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
MyType 이라는 모든 기호와 일치합니다. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
MyType1 또는 MyType2 라는 모든 기호와 일치합니다. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
특정 메서드 MyMethod 를 지정된 정규화된 시그니처와 비교합니다. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
특정 메서드 MyMethod1 및 MyMethod2 를 개별 정규화된 시그니처와 비교합니다. |
특정 형식 및 해당 파생 형식 제외
분석에서 특정 형식과 해당 파생 형식을 제외할 수 있습니다. 예를 들어 MyType
이라는 형식 및 해당 파생 형식 내에 있는 메서드에서 규칙이 실행되지 않도록 지정하려면 프로젝트의 .editorconfig 파일에 다음 키-값 쌍을 추가합니다.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
옵션 값의 허용되는 기호 이름 형식(|
로 구분):
- 형식 이름만(포함하는 형식이나 네임스페이스와 관계없이 해당 이름의 모든 형식 포함)
- 기호의 설명서 ID 형식에 있는 정규화된 이름(선택적
T:
접두사 포함)
예:
옵션 값 | 요약 |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
MyType 이라는 모든 형식 및 모든 해당 파생 형식과 일치합니다. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
MyType1 또는 MyType2 라는 모든 형식 및 모든 해당 파생 형식과 일치합니다. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
지정된 정규화된 이름의 특정 MyType 형식 및 모든 해당 파생 형식과 일치합니다. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
개별 정규화된 이름의 특정 MyType1 , MyType2 형식 및 모든 해당 파생 형식과 일치합니다. |
의사 코드 예제
하드 코드된 바이트 배열 위반
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);
}
}
하드 코드된 Convert.FromBase64String 위반
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);
}
}
하드 코드된 Encoding.GetBytes 위반
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);
}
}
해결 방법
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);
}
}
.NET
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기