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