SYSLIB0060: Los constructores Rfc2898DeriveBytes están obsoletos

A partir de .NET 10, todos los constructores de System.Security.Cryptography.Rfc2898DeriveBytes están obsoletos. Llamar a estos constructores en código genera una advertencia SYSLIB0060 en tiempo de compilación.

Motivo de obsolescencia

La implementación basada en instancias de PBKDF2, que proporciona System.Security.Cryptography.Rfc2898DeriveBytes, ofrece un uso no estándar al permitir la transmisión de bytes y realizar llamadas consecutivas a GetBytes. Esto no es el uso previsto de PBKDF2; el algoritmo debe usarse como una sola ejecución. La funcionalidad de una sola ejecución existe como el método estático Rfc2898DeriveBytes.Pbkdf2 y debe usarse en lugar de crear instancias de System.Security.Cryptography.Rfc2898DeriveBytes.

Solución alternativa

Cambie las instancias de System.Security.Cryptography.Rfc2898DeriveBytes y las llamadas a GetBytes para usar, en su lugar, el método estático de una sola ejecución Rfc2898DeriveBytes.Pbkdf2.

Por ejemplo, cambie este código:

Rfc2898DeriveBytes kdf = new Rfc2898DeriveBytes(password, salt, iterations, hashAlgorithm);
byte[] derivedKey = kdf.GetBytes(64);

A esto:

byte[] derivedKey = Rfc2898DeriveBytes.Pbkdf2(password, salt, iterations, hashAlgorithm, 64);

Si usó un Rfc2898DeriveBytes constructor que aceptó un tamaño de salt, deberá crear manualmente el salt (Rfc2898DeriveBytes.Pbkdf2 no admite una sobrecarga que acepte un tamaño de salt). Para mantener la coherencia con la implementación anterior, use RandomNumberGenerator.Fill para rellenar una matriz existente con bytes criptográficos seguros o RandomNumberGenerator.GetBytes para crear una nueva matriz con bytes criptográficamente seguros.

Por ejemplo, cambie este código:

Rfc2898DeriveBytes kdf = new Rfc2898DeriveBytes(password, saltSize, iterations, hashAlgorithm);
byte[] salt = kdf.Salt;
byte[] derivedKey = kdf.GetBytes(64);

A esto:

byte[] salt = RandomNumberGenerator.GetBytes(saltSize);
byte[] derivedKey = Rfc2898DeriveBytes.Pbkdf2(password, salt, iterations, hashAlgorithm, 64);

Suprimir una advertencia

Si debe usar la API obsoleta, puede suprimir la advertencia en el código o en el archivo del proyecto.

Para suprimir solo una infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la advertencia.

// Disable the warning.
#pragma warning disable SYSLIB0060

// Code that uses obsolete API.
// ...

// Re-enable the warning.
#pragma warning restore SYSLIB0060

Para suprimir todas las advertencias de SYSLIB0060 del proyecto, agregue una propiedad <NoWarn> al archivo del proyecto.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
   ...
   <NoWarn>$(NoWarn);SYSLIB0060</NoWarn>
  </PropertyGroup>
</Project>

Para obtener más información, vea Suprimir advertencias.