Share via


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 8 No

Causa

Al crear una instancia de System.Security.Cryptography.Rfc2898DeriveBytes, utilice uno de los algoritmos siguientes:

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