Compartilhar via


CA5379: garantir que o algoritmo da função de derivação de chaves seja suficientemente forte

Property Valor
ID da regra CA5379
Título Verificar se o algoritmo de função de derivação de chave é suficientemente forte
Categoria Segurança
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Não

Causa

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

Descrição da regra

A classe Rfc2898DeriveBytes usa o algoritmo SHA1 como padrão. Ao instanciar um objeto Rfc2898DeriveBytes, você deve especificar um algoritmo de hash de SHA256 ou superior. Observe que a propriedade Rfc2898DeriveBytes.HashAlgorithm tem apenas um acessador get.

Como corrigir violações

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

Versões mais antigas do .NET Framework ou do .NET Core podem não permitir que você especifique um algoritmo de hash da função de derivação de chave. Nesses casos, você precisa atualizar a versão da 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 do aplicativo.

Suprimir um aviso

Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar 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 em um arquivo, uma pasta ou um projeto, defina a severidade como none no arquivo de configuração.

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

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

Exemplos de pseudocódigo

Especificar algoritmo de hash em 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 em 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 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);
    }
}