CA5379:确保密钥派生功能算法足够强

属性
规则 ID CA5379
标题 确保密钥派生功能算法足够强大
类别 安全性
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用

原因

在实例化 System.Security.Cryptography.Rfc2898DeriveBytes 时使用以下算法之一:

规则说明

Rfc2898DeriveBytes 类默认使用 SHA1 算法。 在实例化 Rfc2898DeriveBytes 对象时,应指定 SHA256 或更高级别的哈希算法。 注意,Rfc2898DeriveBytes.HashAlgorithm 属性只具有 get 访问器。

如何解决冲突

由于 MD5SHA1 容易出现冲突,因此请对 Rfc2898DeriveBytes 类使用 SHA256 或更高级别。

利用旧版 .NET Framework 或 .NET Core,可能无法指定密钥派生功能哈希算法。 在这种情况下,需要升级 .NET 的目标框架版本,以使用更强的算法。

何时禁止显示警告

不建议禁止显示此规则,除非为了应用程序兼容性原因。

抑制警告

如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。

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

若要对文件、文件夹或项目禁用该规则,请在配置文件中将其严重性设置为 none

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

有关详细信息,请参阅如何禁止显示代码分析警告

伪代码示例

在构造函数冲突中指定哈希算法

using System.Security.Cryptography;

class ExampleClass
{
    public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
    {
        var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt, iterations, HashAlgorithmName.MD5);
    }
}

在派生类的构造函数冲突中指定哈希算法

using System.Security.Cryptography;

class DerivedClass : Rfc2898DeriveBytes
{
    public DerivedClass (byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm) : base(password, salt, iterations, hashAlgorithm)
    {
    }
}

class ExampleClass
{
    public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
    {
        var derivedClass = new DerivedClass(password, salt, iterations, HashAlgorithmName.MD5);
    }
}

在派生类冲突中设置哈希算法属性

using System.Security.Cryptography;

class DerivedClass : Rfc2898DeriveBytes
{
    public DerivedClass (byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm) : base(password, salt, iterations, hashAlgorithm)
    {
    }

    public HashAlgorithmName HashAlgorithm { get; set;}
}

class ExampleClass
{
    public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
    {
        var derivedClass = new DerivedClass(password, salt, iterations, HashAlgorithmName.MD5);
        derivedClass.HashAlgorithm = HashAlgorithmName.SHA256;
    }
}

解决方案

using System.Security.Cryptography;

class ExampleClass
{
    public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
    {
        var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt, iterations, HashAlgorithmName.SHA256);
    }
}