CA5351 不使用损坏的加密算法

规则 ID CA5351
类别 安全性
修复是中断修复还是非中断修复 非中断

注意

此警告上次更新于 2015 年 11 月。

原因

哈希函数(如 MD5 )和加密算法(如 DESRC2 )可能会带来重大风险,并可能通过普通的攻击技术(如暴力攻击和哈希冲突)导致暴露敏感信息。

下面的加密算法列表受到已知加密攻击。 加密哈希算法 MD5 受到哈希冲突攻击。 根据使用情况,哈希冲突可能会使依赖哈希函数这一唯一加密输出的系统受到假冒、篡改或其他类型的攻击。 加密算法 DESRC2 受到加密攻击,可能会导致加密数据的意外泄露。

规则说明

损坏的加密算法不安全,不鼓励继续使用。 尽管具体的漏洞因使用环境的不同而异,但 MD5 哈希算法仍易遭到已知的冲突攻击。 用于确保数据完整性的哈希算法(例如文件签名或数字证书)特别容易受到攻击。 在这种情况下,攻击者可能会生成两个独立的数据块,以便在不更改哈希值或使相关数字签名无效的情况下,将良性数据替换为恶意数据。

对于加密算法:

  • DES 加密使用的密钥强度较低,可能在一天内被暴力破解。

  • RC2 加密容易遭受与密钥相关的攻击,攻击者可以通过这些攻击找出所有密钥值之间的数学关系。

当在源代码中找到上述任何加密函数时,将触发此规则并向用户发出警告。

如何解决冲突

使用更强大的加密选项:

  • 对于 MD5,请使用 SHA-2 系列中的哈希(例如 SHA512SHA384SHA256)。

  • 对于 DES 和 RC2,请使用 Aes 加密。

何时禁止显示警告

除非经过加密专家审查,否则不要禁止显示此规则的警告。

抑制警告

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

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

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

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

若要禁用此整个规则类别,请在配置文件中将此类别的严重性设置为 none

[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Security.severity = none

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

伪代码示例

下面的伪代码示例演示此规则检测到的模式和可能的替代模式。

MD5 哈希冲突

using System.Security.Cryptography;
...
var hashAlg = MD5.Create();

解决方案:

using System.Security.Cryptography;
...
var hashAlg = SHA256.Create();

RC2 加密冲突

using System.Security.Cryptography;
...
RC2 encAlg = RC2.Create();

解决方案:

using System.Security.Cryptography;
...
using (AesManaged encAlg = new AesManaged())
{
  ...
}

DES 加密冲突

using System.Security.Cryptography;
...
DES encAlg = DES.Create();

解决方案:

using System.Security.Cryptography;
...
using (AesManaged encAlg = new AesManaged())
{
  ...
}