CA5379: Certifique-se de que o algoritmo da função de derivação de chave é suficientemente forte
Propriedade | valor |
---|---|
ID da regra | CA5379 |
Cargo | Garantir que o algoritmo da função de derivação de chave seja suficientemente forte |
Categoria | Segurança |
A correção está quebrando ou não quebrando | Sem quebra |
Habilitado por padrão no .NET 8 | Não |
Causa
Uso de um dos seguintes algoritmos ao instanciar System.Security.Cryptography.Rfc2898DeriveBytes:
- System.Security.Cryptography.MD5
- System.Security.Cryptography.SHA1
- Um algoritmo que a regra não pode determinar em tempo de compilação
Descrição da regra
O Rfc2898DeriveBytes padrão da classe é usar o SHA1 algoritmo. Ao instanciar um objeto, você deve especificar um Rfc2898DeriveBytes algoritmo de hash de SHA256 ou superior. Note que Rfc2898DeriveBytes.HashAlgorithm a propriedade só tem um get
acessador.
Como corrigir violações
Porque MD5 ou são vulneráveis a colisões, uso SHA256 ou SHA1 superior para a Rfc2898DeriveBytes classe.
Versões mais antigas do .NET Framework ou .NET Core podem não permitir que você especifique um algoritmo de hash de função de derivação de chave. Nesses casos, você precisa atualizar a versão de estrutura de destino do .NET para usar um algoritmo mais forte.
Quando suprimir avisos
Não é recomendável suprimir essa regra, exceto por motivos de compatibilidade de aplicativos.
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 CA5379
// The code that's violating the rule is on this line.
#pragma warning restore CA5379
Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA5379.severity = none
Para obter mais informações, consulte Como suprimir avisos de análise de código.
Exemplos de pseudocódigo
Especificar algoritmo de hash na violação do construtor
using System.Security.Cryptography;
class ExampleClass
{
public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
{
var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt, iterations, HashAlgorithmName.MD5);
}
}
Especificar algoritmo de hash na violação do construtor da classe derivada
using System.Security.Cryptography;
class DerivedClass : Rfc2898DeriveBytes
{
public DerivedClass (byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm) : base(password, salt, iterations, hashAlgorithm)
{
}
}
class ExampleClass
{
public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
{
var derivedClass = new DerivedClass(password, salt, iterations, HashAlgorithmName.MD5);
}
}
Definir a propriedade do algoritmo de hash na violação de classes derivadas
using System.Security.Cryptography;
class DerivedClass : Rfc2898DeriveBytes
{
public DerivedClass (byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm) : base(password, salt, iterations, hashAlgorithm)
{
}
public HashAlgorithmName HashAlgorithm { get; set;}
}
class ExampleClass
{
public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
{
var derivedClass = new DerivedClass(password, salt, iterations, HashAlgorithmName.MD5);
derivedClass.HashAlgorithm = HashAlgorithmName.SHA256;
}
}
Solução
using System.Security.Cryptography;
class ExampleClass
{
public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
{
var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt, iterations, HashAlgorithmName.SHA256);
}
}