CA5379: Ensure key derivation function algorithm is sufficiently strong (Asegurarse de que el algoritmo de función de derivación de claves es suficientemente seguro)
Propiedad | Value |
---|---|
Identificador de la regla | CA5379 |
Título | Asegurarse de que el algoritmo de función de derivación de claves es suficientemente seguro |
Categoría | Seguridad |
La corrección interrumpe o no interrumpe | Poco problemático |
Habilitado de forma predeterminada en .NET 9 | No |
Causa
Al crear una instancia de System.Security.Cryptography.Rfc2898DeriveBytes, utilice uno de los algoritmos siguientes:
- System.Security.Cryptography.MD5
- System.Security.Cryptography.SHA1
- Un algoritmo que la regla no pueda determinar en tiempo de compilación
Descripción de la regla
De forma predeterminada, la clase Rfc2898DeriveBytes usa el algoritmo SHA1. Al crear una instancia de un objeto Rfc2898DeriveBytes, debe especificar un algoritmo hash de SHA256 o superior. Tenga en cuenta que la propiedad Rfc2898DeriveBytes.HashAlgorithm solo tiene un descriptor de acceso get
.
Cómo corregir infracciones
Dado que MD5 o SHA1 son vulnerables a las colisiones, use SHA256 o una versión superior para la clase Rfc2898DeriveBytes.
Es posible que las versiones anteriores de .NET Framework o .NET Core no le permitan especificar un algoritmo hash de la función de derivación de claves. En tales casos, debe actualizar la versión de la plataforma de destino de .NET para usar un algoritmo más seguro.
Cuándo suprimir las advertencias
No se recomienda suprimir esta regla excepto por motivos de compatibilidad de la aplicación.
Supresión de una advertencia
Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.
#pragma warning disable CA5379
// The code that's violating the rule is on this line.
#pragma warning restore CA5379
Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad en none
del archivo de configuración.
[*.{cs,vb}]
dotnet_diagnostic.CA5379.severity = none
Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.
Ejemplos de pseudocódigo
Infracción de especificación de un algoritmo hash en un constructor
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);
}
}
Infracción de especificación de un algoritmo hash en un constructor de la clase 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);
}
}
Infracción de establecimiento de la propiedad del algoritmo hash en las clases 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;
}
}
Solución
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);
}
}