日本語

開発者ツール · SHA ハッシュ計算ツール

暗号化ハッシュとチェックサム: CRC32 と xxHash が約束できないこと

· 背景

しゃ-256 暗号化 セキュリティ

リスク軸におけるチェックサム速度と暗号化ハッシュ強度の比較
オリジナル ToolAcre ベクトル イラスト

CRC32、FNV、および xxHash もハッシュですが、敵対者に対する保証はありません。この投稿では、暗号化ハッシュとチェックサムを区別するものと、ユースケースごとに選択する方法について説明します。

どのジョブのどのハッシュですか? — スピードか敵対者の安全性の選択

ハッシュ関数には、偶発的なエラーを検出するためのチェックサム、配布とパフォーマンスのための非暗号化ハッシュ、およびセキュリティのための暗号化ハッシュの 3 つのカテゴリがあります。カテゴリごとに異なる保証があり、速度とダイジェスト サイズのトレードオフも異なります。 CRC32 のようなチェックサムは高速かつ短い (4 バイト、8 16 進数文字) ものの、意図的な変更に対する保護はありません。 xxHash や MurmurHash などの非暗号化ハッシュも高速で、ハッシュ テーブルやデータ分散に役立ちますが、衝突を引き起こそうとする敵対者に対する保護はありません。 SHA-256 のような暗号化ハッシュは低速で、より長いダイジェスト (32 バイト、64 16 進文字) を生成しますが、プリイメージ耐性と衝突耐性、つまり敵対者から保護するセキュリティ特性を提供します。

ユースケースに合わせて間違ったハッシュ関数を選択することは、よくあるセキュリティ上の間違いです。 CRC32 を使用して信頼できないソースからのファイルのダウンロードを検証することは効果がありません。攻撃者は簡単にファイルを変更し、CRC32 を再計算できます。高頻度ハッシュ テーブルで高速ハッシュ関数として SHA-256 を使用するのは無駄です。 CRC32 または高速な非暗号化ハッシュで十分であり、安価です。

偶発的エラーのチェックサム — 送信中のビット反転を検出するための CRC の設計

チェックサムは、送信中または保存中のエラー検出用に設計されており、エラーはランダムで偶発的なものであると想定されます。 CRC (巡回冗長検査) は、もともと通信におけるビット 反転を検出するために設計されました。 CRC32 は、32 ビットのダイジェストを生成します。送信中にランダムなビット反転によってフレームが破損した場合、ほぼ確実に CRC32 が変化し、受信側に再送信を要求するよう警告します。 CRC は、多項式に応じて、特定の数までのビット エラーを検出できます。ほとんどの一般的な使用例では、単一ビット フリップまたは数ビット フリップのバーストが確実に検出されます。

CRC は決定論的ですが、暗号化的ではありません。ファイルとその CRC32 が与えられると、攻撃者はファイルを変更し、予想される値と一致するように CRC32 を再計算することができます。 CRC 多項式の知識がある敵にとって、衝突を引き起こすのは簡単です。 CRC は意図的な変更に抵抗することを意図したものではありませんでした。これは純粋に偶発的なエラーを検出するためのものです。 ZIP ファイルや JPEG ファイルなどの従来のシステムでは、この目的で CRC が使用されます。最新のプロトコルでは、スタンドアロンの整合性チェックとしてではなく、暗号化または認証されたチャネル内の高速エラー検出のために CRC を使用します。

配布用の非暗号化ハッシュ - ハッシュ テーブルおよびパーティショニング内の FNV、MurmurHash、および xxHash

FNV-1a、MurmurHash、xxHash などの非暗号化ハッシュは、ハッシュ テーブルとデータ パーティショニングの速度と均一性を目的に設計されています。待ち時間が非常に短く、セキュリティ特性を気にせずにサーバーまたはバケット間でデータを分割する必要がある状況で使用されます。キャッシュを構築していて、キーをバケット番号にマップする必要がある場合は、高速ハッシュが適切です。 MurmurHash は、ハッシュ テーブルの使用のために明示的に設計されており、ほとんどのハードウェアでは SHA よりも高速です。 xxHash はより新しく、大規模なキャッシュとベクトル化を備えた最新の CPU 向けに最適化されています。

これらのハッシュは、プリイメージ攻撃 (特定のダイジェストを生成する入力の検出) や衝突攻撃 (同じダイジェストを生成する 2 つの異なる入力の検出) に抵抗しないため、暗号化されません。攻撃者はハッシュ アルゴリズムを計算し、衝突する入力やターゲットの出力を生成する入力を見つけることができます。信頼できる環境 (すべてのノードが制御下にあるクラスター) 内では、これは許容されます。信頼できないユーザーが入力を制御できる場合、非暗号化ハッシュは、パフォーマンスを低下させる衝突攻撃に対して脆弱になります (ハッシュ テーブルの最悪のケースは、すべてのキーが衝突する場合の線形検索です)。または、その他の副作用が発生します。

暗号化ハッシュによって追加されるもの — 意図的な攻撃者に対するプリイメージと衝突耐性

SHA-256、SHA-384、SHA-512 などの暗号化ハッシュはプリイメージ耐性を提供します。ダイジェストが与えられた場合、そのダイジェストを生成する入力を見つけることは計算上不可能です。また、衝突耐性も提供します。同じダイジェストを生成する 2 つの異なる入力を見つけることは計算上不可能です。これらのプロパティは、ダウンロードを偽造したり、偽の証明書を作成したり、メッセージを改ざんしたりする攻撃者から保護します。コストは速度です。SHA-256 は、ほとんどのハードウェアで CRC32 よりも遅く、xxHash よりも遅くなります。

SHA-1 は暗号的に壊れており (衝突は実際的です)、新しいセキュリティ目的には使用すべきではありませんが、レガシー互換性のために依然として計算されています。 SHA-256、SHA-384、および SHA-512 は強力なままであり、暗号化ハッシュの標準的な選択肢です。 SHA-2 の「2」は、SHA アルゴリズムの 2 番目のファミリーを示します (最初のファミリーはオリジナルの SHA-1 です。SHA-3 は新しいファミリーですが、この目的にはほとんど使用されません)。

暗号化ハッシュは敵対的なプロパティを追加します。この記事では、サポートされていない相対速度に関する主張を回避しています。

5 つのシナリオを適切なハッシュ ファミリと照合します。まず、AES: CRC32 で暗号化された信頼できるチャネル経由で送信されるネットワーク フレームが適切です。暗号化により変更が防止され、CRC により偶発的な破損が検出されます。 2 番目に、ロード バランシングのためのハッシュ テーブルまたは一貫したハッシュ。xxHash のような非暗号化ハッシュが適切です。スピードが重要であり、環境は信頼されています。 3 番目に、信頼できないソースからのダウンロードの整合性を検証する: SHA-256 が必要です。攻撃者は、SHA-256 を破壊することなく、ファイルとチェックサムを変更する可能性がありますが、暗号化ハッシュを変更することはできません。

4 番目、デジタル署名と証明書: SHA-256 が必須であり、RSA や ECDSA などの非対称アルゴリズムと組み合わせられます。署名は、署名後にハッシュが変更されていないことを証明します。 5 番目に、ユーザーがアップロードしたファイルの重複排除: SHA-256 が必要です。これは、非暗号化ハッシュ内の既存のファイルと衝突するように設計されたファイルをユーザーが意図的にアップロードする可能性があるためです。重複排除が xxHash に基づいている場合、攻撃者は別のファイルと同じハッシュを持つ、内容が異なるファイルをアップロードすることができ、システムがアップロードを誤って破棄する可能性があります。

実用的な例 — 5 つのシナリオ (ネットワーク フレーム、ハッシュ マップ、ダウンロード検証、署名、ユーザー アップロードの重複排除) を適切なファミリーにマッチング

あらゆるユースケースに対して暗号化ハッシュを選択すると、パフォーマンスのオーバーヘッドが発生します。 SHA-256 は CRC よりも遅く、xxHash よりも遅くなります。ホット ループ (1 秒間に何百万回も実行されるコード) では、そのオーバーヘッドが顕著になります。セットアップ段階またはバッチ操作では、この影響は無視できます。決定の枠組みは次のとおりです。敵には衝突を引き起こすインセンティブがあるか? 「はい」の場合は、SHA-256 を使用してください。 「いいえ」の場合、および速度が重要な場合は、より高速なハッシュを使用してください。速度よりもセキュリティが重要な場合は、関係なく SHA-256 を使用してください。

よくある間違いは、現在は壊れている古い暗号ハッシュである MD5 を使用することです。 MD5 は 1992 で設計され、衝突は 2004 で実証されました。セキュリティ目的で MD5 を使用することは安全ではありません。これはレガシー システムや速度が優先される状況で時々見られますが、現時点では MD5 が正しい選択となるシナリオはありません。速度が必要な場合は xxHash を使用し、速度が必要な場合は xxHash を使用します。セキュリティが必要な場合は、SHA-256 を使用してください。 MD5 は絶対に使用しないでください。

スループットと衝突動作には実装固有の証拠が必要なため、シナリオ マッピングは定性的なままです

パスワード ハッシュは 4 番目のカテゴリであり、チェックサムや汎用暗号ハッシュとは異なります。パスワードのハッシュ化に SHA-256 を使用しないでください。代わりに、bcrypt、scrypt、Argon2 などのパスワード ハッシュ関数を使用します。これらの関数は意図的に遅く、ソルトが含まれています。 SHA-256 のような高速暗号ハッシュにより、パスワードの推測が安価になります。攻撃者は 1 秒あたり何百万もの推測を試みることができます。パスワード ハッシュ関数は、各推測に CPU とメモリの負荷がかかるように設計されているため、強力なパスワードを推測するには、攻撃者が待つことができるよりも長い時間がかかります。パスワード ハッシュは、独自の要件を持つ特殊な使用例です。

ToolAcre SHA ハッシュ計算ツールはパスワード ハッシュをサポートしておらず、意図的に MD5、カスタム パラメーター、および高速ハッシュを提供していません。これは、認証やパスワードの保存のためではなく、検証と整合性チェックのために標準の SHA ダイジェストを計算するためのツールです。

要点: 敵対者がいるかいないか — 誰かがデータを改ざんする可能性がある場合は、ToolAcre SHA ハッシュ計算ツールを使用してください

ハッシュ アルゴリズムの選択は、システム全体のパフォーマンスとセキュリティの両方に影響を与える基本的な決定です。ダイジェストの信頼性は、それを生成したアルゴリズムと同じくらい信頼できます。ファイル検証に CRC32 を選択した場合、ダイジェストは意図的な変更に対する保護を提供しません。ハッシュ テーブルに SHA-256 を選択すると、リソースが無駄になります。各カテゴリの特性とトレードオフを理解すると、正しく選択できるようになります。

ToolAcre SHA ハッシュ計算ツールは、SHA-1 から SHA-512 までを提供し、ほとんどのユースケースに重要な暗号化ハッシュをカバーします。 CRC32、xxHash、または MD5 は提供しません。これは、これらのそれぞれが特定のコンテキスト (信頼できるチャネルでのエラー検出には CRC、制御された環境でのパフォーマンスには xxHash、MD5 には何も) で適切な選択肢であるためであり、それぞれをいつ使用するかを強調せずに提供すると、間違いが助長されます。この計算機は、標準の暗号ダイジェストを計算するためのものです。これらのハッシュが必要な場合は、`crc32`、`xxh64`、または同等のツールを備えたコマンド ラインを使用します。ダウンロード検証、証明書フィンガープリント、git コミット、および敵対者がデータを改ざんする可能性のある同様のユースケースについては、ToolAcre SHA ハッシュ計算ツールを介して SHA-256 にアクセスしてください。