CA5373: Não use a função de derivação de chave obsoleta
Property | valor |
---|---|
ID da regra | CA5373 |
Título | 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 9 | Não |
Motivo
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 Rfc2898DeriveBytes
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 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);
}
}