Share via


CA5351 끊어진 암호화 알고리즘 사용 안 함

속성
규칙 ID CA5351
타이틀 손상된 암호화 알고리즘을 사용하지 마세요.
범주 보안
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 8에서 기본적으로 사용 아니요

참고 항목

이 경고는 2015년 11월에 마지막으로 업데이트되었습니다.

원인

MD5 등의 해시 함수와 DESRC2 등의 암호화 알고리즘은 상당한 위험을 노출시킬 수 있으며 무차별 암호 대입 공격 및 해시 충돌과 같은 간단한 공격 기법을 통해 중요한 정보가 노출될 수 있습니다.

아래 암호화 알고리즘 목록은 알려진 암호화 공격을 받습니다. 암호화 해시 알고리즘 MD5 는 해시 충돌 공격을 받습니다. 사용법에 따라 해시 충돌로 인해 해시 함수의 고유한 암호화 출력을 사용하는 시스템이 가장, 변조 또는 다른 종류의 공격을 받을 수 있습니다. 암호화 알고리즘 DESRC2 에는 의도하지 않게 암호화된 데이터가 노출될 수 있는 암호화 공격을 받습니다.

규칙 설명

끊어진 암호화 알고리즘은 안전하지 않은 것으로 간주되므로 사용해서는 안 됩니다. 사용 컨텍스트에 따라 구체적인 취약성이 달라지지만 MD5 해시 알고리즘은 알려진 충돌 공격에 취약합니다. 데이터 무결성(예: 파일 시그니처 또는 디지털 인증서)을 보장하는 데 사용되는 해시 알고리즘이 특히 취약합니다. 이 컨텍스트에서 공격자는 해시 값을 변경하거나 연결된 디지털 서명을 무효화하지 않고 정상적인 데이터가 악성 데이터로 대체될 수 있도록 두 가지 데이터를 생성할 수 있습니다.

암호화 알고리즘의 경우:

  • DES 암호화는 하루 미만의 무차별 암호 대입 공격일 수 있는 작은 키 크기를 포함합니다.

  • RC2 암호화는 공격자가 모든 키 값 간의 수학적 관계를 찾는 관련 키 공격에 취약합니다.

이 규칙은 소스 코드에서 위의 암호화 기능을 발견할 때 트리거되며 사용자에게 경고를 throw합니다.

위반 문제를 해결하는 방법

보다 강력한 암호화 옵션을 사용합니다.

  • MD5의 경우 SHA-2 제품군(예: SHA512, SHA384, SHA256)에 해시를 사용합니다.

  • DES 및 RC2의 경우 Aes 암호화를 사용합니다.

경고를 표시하지 않는 경우

암호화 전문가가 검토하지 않은 경우 이 규칙의 경고가 표시되지 않도록 하지 마세요.

경고 표시 안 함

단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.

#pragma warning disable CA5351
// The code that's violating the rule is on this line.
#pragma warning restore CA5351

파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않도록 설정하려면 구성 파일에서 심각도를 none으로 설정합니다.

[*.{cs,vb}]
dotnet_diagnostic.CA5351.severity = none

자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.

의사 코드 예제

다음 의사 코드 샘플에서는 이 규칙 및 가능한 대안에 의해 탐지되는 패턴을 보여 줍니다.

MD5 해시 위반

using System.Security.Cryptography;
...
var hashAlg = MD5.Create();

해결 방법:

using System.Security.Cryptography;
...
var hashAlg = SHA256.Create();

RC2 암호화 위반

using System.Security.Cryptography;
...
RC2 encAlg = RC2.Create();

해결 방법:

using System.Security.Cryptography;
...
using (AesManaged encAlg = new AesManaged())
{
  ...
}

DES 암호화 위반

using System.Security.Cryptography;
...
DES encAlg = DES.Create();

해결 방법:

using System.Security.Cryptography;
...
using (AesManaged encAlg = new AesManaged())
{
  ...
}