CA5379:确保密钥派生功能算法足够强
属性 | 值 |
---|---|
规则 ID | CA5379 |
标题 | 确保密钥派生功能算法足够强大 |
类别 | 安全性 |
修复是中断修复还是非中断修复 | 非中断 |
在 .NET 8 中默认启用 | 否 |
原因
在实例化 System.Security.Cryptography.Rfc2898DeriveBytes 时使用以下算法之一:
规则说明
Rfc2898DeriveBytes 类默认使用 SHA1 算法。 在实例化 Rfc2898DeriveBytes 对象时,应指定 SHA256 或更高级别的哈希算法。 注意,Rfc2898DeriveBytes.HashAlgorithm 属性只具有 get
访问器。
如何解决冲突
由于 MD5 或 SHA1 容易出现冲突,因此请对 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);
}
}