SYSLIB0060: Rfc2898DeriveBytes-konstruktorer är föråldrade

Från och med .NET 10 är alla konstruktorer på System.Security.Cryptography.Rfc2898DeriveBytes föråldrade. Att anropa dessa konstruktorer i kod genererar en varning SYSLIB0060 vid kompileringstillfället.

Orsak till obsoletion

Den instansbaserade implementeringen av PBKDF2, som System.Security.Cryptography.Rfc2898DeriveBytes tillhandahåller, erbjuder en icke-standardanvändning genom att strömma tillbaka byte och tillåta efterföljande anrop till GetBytes. Detta är inte den avsedda användningen av PBKDF2; algoritmen ska användas i en engångsanvändning. Engångsfunktionaliteten finns som den statiska metoden Rfc2898DeriveBytes.Pbkdf2 och bör användas istället för att instansiera System.Security.Cryptography.Rfc2898DeriveBytes.

Lösning

Byt ut instanser av System.Security.Cryptography.Rfc2898DeriveBytes och anrop till GetBytes så att du använder Rfc2898DeriveBytes.Pbkdf2:s statiska engångsanropsmetod istället.

Ändra till exempel den här koden:

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

Så här:

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

Om du använde en Rfc2898DeriveBytes konstruktor som accepterade en saltstorlek måste du manuellt skapa saltet (Rfc2898DeriveBytes.Pbkdf2 har ingen överlagring som accepterar en saltstorlek). För konsekvens med den tidigare implementeringen använder du RandomNumberGenerator.Fill för att fylla en befintlig matris med kryptografiskt säkra byte eller RandomNumberGenerator.GetBytes för att skapa en ny matris med kryptografiskt säkra byte.

Ändra till exempel den här koden:

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

Så här:

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

Undertrycka en varning

Om du måste använda det föråldrade API:et kan du utelämna varningen i koden eller i projektfilen.

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och återaktiverar sedan varningen.

// Disable the warning.
#pragma warning disable SYSLIB0060

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

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

Om du vill ignorera alla SYSLIB0060 varningar i projektet lägger du till en <NoWarn>-egenskap i projektfilen.

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

Mer information finns i Utelämna varningar.