CA5351 破られた暗号アルゴリズムを使用しないでください

プロパティ
ルール ID CA5351
Title 破損した暗号アルゴリズムは使用しません
[カテゴリ] Security
修正が中断か中断なしであるか なし
.NET 8 では既定で有効 いいえ

Note

この警告の最終更新は 2015 年 11 月です。

原因

MD5 などのハッシュ関数および DESRC2 などの暗号アルゴリズムは、重大な危険にさらされている可能性があり、ブルート フォース攻撃やハッシュの競合など、単純な攻撃方法を通して機密情報が漏洩する可能性があります。

下の暗号アルゴリズムの一覧は、既知の暗号攻撃を受ける可能性があります。 暗号化ハッシュ アルゴリズム MD5 は、ハッシュの競合攻撃を受ける可能性があります。 使用状況に応じて、ハッシュの競合は、偽装、改ざん、またはハッシュ関数の一意の暗号出力を使用するシステムへのその他の種類の攻撃を招く可能性があります。 暗号アルゴリズム DESRC2 は、暗号化されたデータの意図しない漏洩につながる可能性のある暗号攻撃の対象となる可能性があります。

規則の説明

破られた暗号アルゴリズムは安全であるとは見なされず、それらを使用しないことをお勧めします。 使用コンテキストに応じて特定の脆弱性は異なりますが、MD5 ハッシュ アルゴリズムは既知の競合攻撃の影響を受けやすくなっています。 データの整合性を確保するために使用するハッシュ アルゴリズム (ファイル署名またはデジタル証明書など) は、特に脆弱です。 このコンテキストでは、攻撃者が 2 つの独立したデータを生成し、ハッシュ値を変更したり、関連付けられているデジタル署名を無効にしたりすることなく、悪意のないデータを悪意のあるデータで置き換えるなどの可能性があります。

暗号アルゴリズムの場合:

  • DES 暗号のキー サイズは小さく、1 日未満でブルートフォースが実行される可能性があります。

  • 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

詳細については、「コード分析の警告を抑制する方法」を参照してください。

疑似コードの例

以下の擬似コード サンプルは、この規則や考えられる代替の規則によって検出されたパターンを示しています。

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())
{
  ...
}