Compartilhar via


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