Share via


CA5379: 키 파생 함수 알고리즘이 충분히 강력한지 확인하세요

속성
규칙 ID CA5379
타이틀 키 파생 함수 알고리즘이 충분히 강력한지 확인
범주 보안
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 8에서 기본적으로 사용 아니요

원인

System.Security.Cryptography.Rfc2898DeriveBytes를 인스턴스화할 때 다음 알고리즘 중 하나를 사용합니다.

규칙 설명

Rfc2898DeriveBytes 클래스는 기본적으로 SHA1 알고리즘을 사용하도록 설정됩니다. Rfc2898DeriveBytes 개체를 인스턴스화할 때 SHA256 이상의 해시 알고리즘을 지정해야 합니다. Rfc2898DeriveBytes.HashAlgorithm 속성에는 get 접근자만 있습니다.

위반 문제를 해결하는 방법

MD5 또는 SHA1이 충돌에 취약하기 때문에 Rfc2898DeriveBytes 클래스에 대해 SHA256 이상을 사용합니다.

이전 버전의 .NET Framework 또는 .NET Core에서는 키 파생 함수 해시 알고리즘을 지정하도록 허용하지 않을 수 있습니다. 이러한 경우 더 강력한 알고리즘을 사용하려면 .NET의 대상 프레임워크 버전을 업그레이드해야 합니다.

경고를 표시하지 않는 경우

애플리케이션 호환성 때문이 아니라면 이 규칙을 표시하지 않는 것이 좋습니다.

경고 표시 안 함

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

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

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

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

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

의사 코드 예제

생성자 위반에서 해시 알고리즘 지정

using System.Security.Cryptography;

class ExampleClass
{
    public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
    {
        var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt, iterations, HashAlgorithmName.MD5);
    }
}

파생 클래스의 생성자 위반에 해시 알고리즘을 지정하세요.

using System.Security.Cryptography;

class DerivedClass : Rfc2898DeriveBytes
{
    public DerivedClass (byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm) : base(password, salt, iterations, hashAlgorithm)
    {
    }
}

class ExampleClass
{
    public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
    {
        var derivedClass = new DerivedClass(password, salt, iterations, HashAlgorithmName.MD5);
    }
}

파생 클래스 위반에서 해시 알고리즘 속성 설정

using System.Security.Cryptography;

class DerivedClass : Rfc2898DeriveBytes
{
    public DerivedClass (byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm) : base(password, salt, iterations, hashAlgorithm)
    {
    }

    public HashAlgorithmName HashAlgorithm { get; set;}
}

class ExampleClass
{
    public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
    {
        var derivedClass = new DerivedClass(password, salt, iterations, HashAlgorithmName.MD5);
        derivedClass.HashAlgorithm = HashAlgorithmName.SHA256;
    }
}

해결 방법

using System.Security.Cryptography;

class ExampleClass
{
    public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
    {
        var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt, iterations, HashAlgorithmName.SHA256);
    }
}