Partilhar via


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

Propriedade valor
ID da regra CA5373
Cargo Não use a função de derivação de chave obsoleta
Categoria Segurança
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 8 Não

Causa

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

Descrição da regra

Esta regra deteta a invocação de métodos System.Security.Cryptography.PasswordDeriveBytes de derivação de chave fraca e Rfc2898DeriveBytes.CryptDeriveKey. System.Security.Cryptography.PasswordDeriveBytes usou um algoritmo fraco PBKDF1. Rfc2898DeriveBytes.CryptDeriveKey não usa contagem de iteração e sal do objeto, o que o Rfc2898DeriveBytes 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 utilizado para o conseguir.

Quando suprimir avisos

Suprima o aviso se o risco associado ao uso de PBKDF1 for cuidadosamente revisado e aceito.

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

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

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

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

Exemplos de pseudocódigo

Violação

No momento em que este artigo foi escrito, o exemplo de pseudocódigo a seguir ilustra o padrão detetado 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);
    }
}