SYSLIB0060: Konstruktory Rfc2898DeriveBytes jsou zastaralé

Počínaje rozhraním .NET 10 jsou všechny konstruktory na System.Security.Cryptography.Rfc2898DeriveBytes zastaralé. Volání těchto konstruktorů v kódu generuje upozornění SYSLIB0060 v době kompilace.

Důvod zastaralosti

Implementace PBKDF2 založená na instancích, kterou poskytuje System.Security.Cryptography.Rfc2898DeriveBytes, nabízí nestandardní využití tím, že "streamuje" bajty zpět a umožňuje postupná volání GetBytes. Nejedná se o zamýšlené použití PBKDF2; algoritmus by se měl použít jako jednorázová akce. Jednorázová funkce existuje jako statická metoda Rfc2898DeriveBytes.Pbkdf2 a měla by se použít místo instancování System.Security.Cryptography.Rfc2898DeriveBytes.

Alternativní řešení

Změňte instance System.Security.Cryptography.Rfc2898DeriveBytes a volání GetBytes tak, aby místo toho používaly Rfc2898DeriveBytes.Pbkdf2 statickou metodu pro jednorázové použití.

Změňte například tento kód:

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

Na toto:

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

Pokud jste použili Rfc2898DeriveBytes konstruktor, který přijímá velikost soli, budete muset ručně vytvořit sůl (Rfc2898DeriveBytes.Pbkdf2 nemá přetížení, které přijímá velikost soli). Pro konzistenci s předchozí implementací použijte RandomNumberGenerator.Fill k vyplnění existujícího pole kryptograficky zabezpečenými bajty nebo RandomNumberGenerator.GetBytes k vytvoření nového pole s kryptograficky zabezpečenými bajty.

Změňte například tento kód:

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

Na toto:

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

Potlačení upozornění

Pokud musíte použít zastaralé rozhraní API, můžete potlačit upozornění v kódu nebo v souboru projektu.

Chcete-li potlačit pouze jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, které chcete zakázat a znovu povolit upozornění.

// Disable the warning.
#pragma warning disable SYSLIB0060

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

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

Pokud chcete potlačit všechna upozornění SYSLIB0060 v projektu, přidejte do souboru projektu vlastnost <NoWarn>.

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

Další informace naleznete v tématu Potlačení upozornění.