다음을 통해 공유


CA5351: 끊어진 암호화 알고리즘을 사용하지 마세요.

속성
규칙 ID CA5351
제목 손상된 암호화 알고리즘을 사용하지 마세요.
범주 보안
수정 사항이 호환성을 깨뜨리는지 여부 또는 무중단인지 여부 주요 변경 아님
.NET 10에서 기본적으로 사용하도록 설정 아니요
적용 가능한 언어 C# 및 Visual Basic

주의

이 경고는 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())
{
  ...
}