Partilhar via


CA5379: Certifique-se de que o algoritmo da função de derivação de chave é suficientemente forte

Propriedade valor
ID da regra CA5379
Cargo Garantir que o algoritmo da função de derivação de chave seja suficientemente forte
Categoria Segurança
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 8 Não

Causa

Uso de um dos seguintes algoritmos ao instanciar System.Security.Cryptography.Rfc2898DeriveBytes:

Descrição da regra

O Rfc2898DeriveBytes padrão da classe é usar o SHA1 algoritmo. Ao instanciar um objeto, você deve especificar um Rfc2898DeriveBytes algoritmo de hash de SHA256 ou superior. Note que Rfc2898DeriveBytes.HashAlgorithm a propriedade só tem um get acessador.

Como corrigir violações

Porque MD5 ou são vulneráveis a colisões, uso SHA256 ou SHA1 superior para a Rfc2898DeriveBytes classe.

Versões mais antigas do .NET Framework ou .NET Core podem não permitir que você especifique um algoritmo de hash de função de derivação de chave. Nesses casos, você precisa atualizar a versão de estrutura de destino do .NET para usar um algoritmo mais forte.

Quando suprimir avisos

Não é recomendável suprimir essa regra, exceto por motivos de compatibilidade de aplicativos.

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.

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

Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

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

Para obter mais informações, consulte Como suprimir avisos de análise de código.

Exemplos de pseudocódigo

Especificar algoritmo de hash na violação do construtor

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);
    }
}

Especificar algoritmo de hash na violação do construtor da classe derivada

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);
    }
}

Definir a propriedade do algoritmo de hash na violação de classes derivadas

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;
    }
}

Solução

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);
    }
}