CA5379: garantir que o algoritmo da função de derivação de chaves seja suficientemente forte
Property | Valor |
---|---|
ID da regra | CA5379 |
Título | Verificar se o algoritmo de função de derivação de chave é suficientemente forte |
Categoria | Segurança |
Correção interruptiva ou sem interrupção | Sem interrupção |
Habilitado por padrão no .NET 9 | Não |
Causa
Usar 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
A classe Rfc2898DeriveBytes usa o algoritmo SHA1 como padrão. Ao instanciar um objeto Rfc2898DeriveBytes, você deve especificar um algoritmo de hash de SHA256 ou superior. Observe que a propriedade Rfc2898DeriveBytes.HashAlgorithm tem apenas um acessador get
.
Como corrigir violações
Como MD5 ou SHA1 são vulneráveis a colisões, use SHA256 ou superior para a classe Rfc2898DeriveBytes.
Versões mais antigas do .NET Framework ou do .NET Core podem não permitir que você especifique um algoritmo de hash da função de derivação de chave. Nesses casos, você precisa atualizar a versão da 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 do aplicativo.
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 CA5379
// The code that's violating the rule is on this line.
#pragma warning restore CA5379
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.CA5379.severity = none
Para obter mais informações, confira Como suprimir avisos de análise de código.
Exemplos de pseudocódigo
Especificar algoritmo de hash em 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 em 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 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);
}
}