CA5373: Não usar a função de derivação de chave obsoleta

Property Valor
ID da regra CA5373
Título Não usar a função de derivação de chave obsoleta
Categoria Segurança
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Não

Causa

Métodos de derivação de chave criptograficamente fraca System.Security.Cryptography.PasswordDeriveBytes e/ou Rfc2898DeriveBytes.CryptDeriveKey são usados para gerar uma chave.

Descrição da regra

Esta regra detecta a invocação de métodos System.Security.Cryptography.PasswordDeriveBytes e Rfc2898DeriveBytes.CryptDeriveKey de derivação de chave fraca. System.Security.Cryptography.PasswordDeriveBytes usou um algoritmo fraco PBKDF1. Rfc2898DeriveBytes.CryptDeriveKey não usa a contagem de iteração e o sal do objeto Rfc2898DeriveBytes, o que o torna fraco.

Como corrigir violações

A derivação de chave baseada em senha deve usar o algoritmo PBKDF2 com hash SHA-2. Rfc2898DeriveBytes.GetBytes pode ser usado para conseguir isso.

Quando suprimir avisos

Suprima o aviso se o risco associado ao uso do PBKDF1 é cuidadosamente analisado e aceito.

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 CA5373
// The code that's violating the rule is on this line.
#pragma warning restore CA5373

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.CA5373.severity = none

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

Exemplos de pseudocódigo

Violação

No momento em que este material foi produzido, o exemplo de pseudocódigo a seguir ilustrava o padrão detectado por essa regra.

using System;
using System.Security.Cryptography;
class TestClass
{
    public void TestMethod(Rfc2898DeriveBytes rfc2898DeriveBytes, string algname, string alghashname, int keySize, byte[] rgbIV)
    {
        rfc2898DeriveBytes.CryptDeriveKey(algname, alghashname, keySize, rgbIV);
    }
}

Solução

using System;
using System.Security.Cryptography;
class TestClass
{
    public void TestMethod(Rfc2898DeriveBytes rfc2898DeriveBytes)
    {
        rfc2898DeriveBytes.GetBytes(1);
    }
}