C#idiomatic C#
ca5373fundamentals/code-analysis/quality-rules

Code analysis

CA5373: Do not use obsolete key derivation function

Provides information about code analysis rule CA5373, including causes, how to fix violations, and when to suppress it.

CA5373 Security enabled by default in .NET 10: No
Fix is breaking or non-breaking Non-breakingApplicable languages C# and Visual Basic

Cause

Cryptographically weak key derivation methods System.Security.Cryptography.PasswordDeriveBytes and/or System.Security.Cryptography.Rfc2898DeriveBytes.CryptDeriveKey are used to generate a key.

Rule description

This rule detects the invocation of weak key derivation methods System.Security.Cryptography.PasswordDeriveBytes and System.Security.Cryptography.Rfc2898DeriveBytes.CryptDeriveKey. System.Security.Cryptography.PasswordDeriveBytes used a weak algorithm PBKDF1. System.Security.Cryptography.Rfc2898DeriveBytes.CryptDeriveKey does not use iteration count and salt from the Rfc2898DeriveBytes object, which makes it weak.

How to fix violations

Password-based key derivation should use the PBKDF2 algorithm with SHA-2 hashing. System.Security.Cryptography.Rfc2898DeriveBytes.GetBytes can be used to achieve that.

When to suppress warnings

Suppress the warning if the risk associated with using PBKDF1 is carefully reviewed and accepted.

Suppress a warning

If you just want to suppress a single violation, add preprocessor directives to your source file to disable and then re-enable the rule.

csharp
#pragma warning disable CA5373
// The code that's violating the rule is on this line.
#pragma warning restore CA5373

To disable the rule for a file, folder, or project, set its severity to none in the configuration file.

ini
[*.{cs,vb}]
dotnet_diagnostic.CA5373.severity = none

For more information, see How to suppress code analysis warnings.

Pseudo-code examples

Violation

As of the time of this writing, the following pseudo-code sample illustrates the pattern detected by this rule.

csharp
using System;
using System.Security.Cryptography;
class TestClass
{
    public void TestMethod(Rfc2898DeriveBytes rfc2898DeriveBytes, string algname, string alghashname, int keySize, byte[] rgbIV)
    {
        rfc2898DeriveBytes.CryptDeriveKey(algname, alghashname, keySize, rgbIV);
    }
}

Solution

csharp
using System;
using System.Security.Cryptography;
class TestClass
{
    public void TestMethod(Rfc2898DeriveBytes rfc2898DeriveBytes)
    {
        rfc2898DeriveBytes.GetBytes(1);
    }
}