SYSLIB0060: I costruttori Rfc2898DeriveBytes sono obsoleti

A partire da .NET 10, tutti i costruttori in System.Security.Cryptography.Rfc2898DeriveBytes sono obsoleti. La chiamata a questi costruttori nel codice genera un avviso SYSLIB0060 in fase di compilazione.

Motivo dell'obsoletione

L'implementazione basata su istanza di PBKDF2, fornita da System.Security.Cryptography.Rfc2898DeriveBytes, offre un utilizzo non standard trasmettendo byte attraverso chiamate successive a GetBytes. Questo non è l'uso previsto di PBKDF2; l'algoritmo deve essere usato come singolo colpo. La funzionalità one-shot esiste come metodo statico Rfc2898DeriveBytes.Pbkdf2 e deve essere usata invece di istanziare System.Security.Cryptography.Rfc2898DeriveBytes.

Soluzione alternativa

Modificare le istanze di System.Security.Cryptography.Rfc2898DeriveBytes e le chiamate a GetBytes per utilizzare invece il metodo statico one-shot Rfc2898DeriveBytes.Pbkdf2.

Ad esempio, modificare questo codice:

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

In questa:

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

Se hai utilizzato un Rfc2898DeriveBytes costruttore che richiede una dimensione per il salt, dovrai creare manualmente il salt (Rfc2898DeriveBytes.Pbkdf2 non ha un overload che accetta una dimensione del salt). Per coerenza con l'implementazione precedente, usare RandomNumberGenerator.Fill per riempire una matrice esistente con byte sicuri crittograficamente o RandomNumberGenerator.GetBytes per creare una nuova matrice con byte sicuri crittograficamente.

Ad esempio, modificare questo codice:

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

In questa:

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

Eliminare un avviso

Se è necessario usare l'API obsoleta, è possibile eliminare l'avviso nel codice o nel file di progetto.

Per eliminare solo una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare l'avviso.

// Disable the warning.
#pragma warning disable SYSLIB0060

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

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

Per eliminare tutti gli avvisi di SYSLIB0060 nel progetto, aggiungere una proprietà <NoWarn> al file di progetto.

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

Per altre informazioni, vedere Eliminare gli avvisi.