MD5 や SHA1 などの最新のハッシュ関数ではなく、エラー検出に CRC を使用するのが適切なのはどのような場合ですか? 前者は組み込みハードウェアに実装するのが簡単ですか?
13 に答える
CRC は、ネットワーク干渉、回線ノイズ、歪みなどから発生する可能性のあるデータのランダム エラーを検出するのに適切に機能します。
CRC は、計算上、MD5 や SHA1 よりもはるかに複雑ではありません。MD5 のようなハッシュ関数を使用することは、ランダム エラー検出にはおそらくやり過ぎです。ただし、あらゆる種類のセキュリティ チェックに CRC を使用すると、MD5 などのより複雑なハッシュ関数よりも安全性が大幅に低下します。
はい、CRC は組み込みハードウェアに実装する方がはるかに簡単です。IC でこれを行うためのさまざまなパッケージ ソリューションを入手することもできます。
CRC は、データの意図しない変更に対して設計されています。つまり、意図しないエラーを検出するのには適していますが、データが悪意を持って処理されていないことを確認する方法としては役に立ちません。
これも参照してください。
CRC ハッシュがハッシュ テーブルにいかに不適切であるかを示す調査を見つけました。また、アルゴリズムの実際の特性についても説明します。この調査には、他のハッシュ アルゴリズムの評価も含まれており、保持するのに適した参考資料です。
アップデート
サイトがダウンしているようです。ただし、インターネットアーカイブにはコピーがあります。
更新 2
まあ。この研究は、CRC をハッシュとして使用するという結論に誤りがあった可能性があることが判明しました。リンクをありがとう@minexew。
このPHPコードのすべての行を1.000.000ループで実行しました。結果はコメント(#)にあります。
hash('crc32', 'The quick brown fox jumped over the lazy dog.');# 750ms 8 chars
hash('crc32b','The quick brown fox jumped over the lazy dog.');# 700ms 8 chars
hash('md5', 'The quick brown fox jumped over the lazy dog.');# 770ms 32 chars
hash('sha1', 'The quick brown fox jumped over the lazy dog.');# 880ms 40 chars
hash('sha256','The quick brown fox jumped over the lazy dog.');# 1490ms 64 chars
hash('sha384','The quick brown fox jumped over the lazy dog.');# 1830ms 96 chars
hash('sha512','The quick brown fox jumped over the lazy dog.');# 1870ms 128 chars
私の結論:
- http://en.wikipedia.org/wiki/Cyclic_redundancy_checkが必要で、セキュリティを気にしない場合は、「crc32b」を使用してください。
セキュリティレイヤーを追加する必要がある場合は、「sha256」(またはそれ以降)を使用してください。
「md5」または「sha1」は次の理由で使用しないでください。
- あなたがセキュリティを気にするときのいくつかのセキュリティ問題
- ハッシュ文字列が長く、CRCだけが必要な場合は「crc32b」よりも低速です
実装、速度、および信頼性に関するCRC情報については、CRCエラー検出アルゴリズムの簡単なガイドを参照してください。それはCRCに関するすべてを持っています。
誰かがデータを悪意を持って変更し、変更を非表示にしようとしない限り、CRCで十分です。「良い」(標準)多項式を使用するだけです。
あなたはあなたが守ろうとしているのは何であるかを言いません。
CRCは、悪意のあるシステム変更を防ぐのではなく、偶発的なデータ破損に対するチェックとして組み込みシステムでよく使用されます。CRCが役立つ場所の例は、システムの初期化中にEPROMイメージを検証して、ファームウェアの破損を防ぐことです。システムブートローダーは、アプリケーションコードのCRCを計算し、コードの実行を許可する前に、保存されている値と比較します。これにより、偶発的なプログラムの破損やダウンロードの失敗の可能性から保護されます。
CRCは、FLASHまたはEEPROMに保存されている構成データを保護するために同様の方法で使用することもできます。CRCが正しくない場合、データに無効のフラグを付け、デフォルトまたはバックアップのデータセットを使用できます。デバイスの障害が原因で、またはユーザーが構成データストアの更新中に電源を切った場合、CRCが無効になる可能性があります。
ハッシュは、複数のビットエラーを持つCRCよりも破損を検出する可能性が高いというコメントがあります。これは真実であり、16ビットまたは32ビットのCRCを使用するかどうかの決定は、使用されている破損したデータブロックの安全性への影響と、2^16または2^32の確率で1を正当化できるかどうかに依存します。データブロックが誤って有効と宣言されています。
多くのデバイスには、標準アルゴリズム用のCRCジェネレーターが組み込まれています。テキサスのMSP430F5Xシリーズには、CRC-CCITT規格のハードウェア実装があります。
私は最近、賢いCRCの使用に出くわしました。jdupeファイル複製識別および削除ツールの作成者(人気のあるexifツールjheadの同じ作成者)は、ファイルの最初のパスでそれを使用します。CRCは、各ファイルの最初の32Kで計算され、同じように見えるファイルをマークします。また、ファイルのサイズも同じである必要があります。これらのファイルは、完全なバイナリ比較を行うファイルのリストに追加されます。大きなメディアファイルのチェックを高速化します。
CRC32 の方が高速で、ハッシュの長さはわずか 32 ビットです。
すばやく軽いチェックサムが必要な場合に使用します。CRC はイーサネットで使用されます。
さらに信頼性が必要な場合は、最新のハッシュ関数を使用することをお勧めします。
計算リソースが非常に限られている場合 (つまり、一部の埋め込み環境)、または多くの出力値を保存/転送する必要があり、スペース/帯域幅が狭い場合にのみ CRC を使用します (CRC は通常 32 ビットであり、MD5 出力は 128 ビット、SHA1 160 です)。ビット、および最大 512 ビットのその他の SHA バリアント)。
CRC は非常に簡単に「偽造」されるため、セキュリティ チェックに CRC を使用しないでください。
(悪意のある変更の検出ではなく) 偶発的なエラー検出の場合でも、ハッシュは単純な CRC よりも優れています。部分的には CRC の計算方法が単純であるため (また、部分的には CRC 値が一般的なハッシュ出力よりも通常短いため、可能な値の範囲がはるかに小さいため)、2 つ以上のエラーがある状況では、より可能性が高くなります。 、1 つのエラーが別のエラーをマスクするため、2 つのエラーにもかかわらず同じ CRC になります。
要するに、適切なハッシュ アルゴリズムを使用しない理由がない限り、単純な CRC は避けてください。
CRC32 の方がはるかに高速で、ハードウェア サポート (Nehalem プロセッサなど) がある場合もあります。本当に、それを使用するのは、ハードウェアとインターフェースしている場合、またはパフォーマンスが非常に厳しい場合だけです.
基本から始めましょう。
暗号化では、ハッシュ アルゴリズムは、ダイジェスト操作を通じて多くのビットをより少ないビットに変換します。ハッシュは、メッセージとファイルの整合性を確認するために使用されます。
すべてのハッシュ アルゴリズムは衝突を生成します。衝突とは、いくつかの多ビットの組み合わせが同じより少ないビットの出力を生成することです。ハッシュ アルゴリズムの暗号強度は、特定の入力に対して出力がどうなるかを個人が判断できないことによって定義されます。システムの。CRC32 と MD5 の違いは、MD5 が予測しにくい大きなハッシュを生成することです。
メッセージの整合性を実装したい場合 (メッセージが転送中に改ざんされていないことを意味します)、衝突を予測できないことは重要な特性です。32 ビット ハッシュは、40 億の異なる一意のハッシュを使用して、 40 億の異なるメッセージまたはファイルを記述できます。40 億と 1 つのファイルがある場合、衝突が 1 回発生することが保証されます。1 TB のビットスペースには、数十億回の衝突の可能性があります。私が攻撃者であり、その 32 ビット ハッシュがどうなるかを予測できる場合、ターゲット ファイルと衝突する感染ファイルを作成できます。それは同じハッシュを持っています。
さらに、10 mbps の送信を行っている場合、パケットが破損して crc32 をバイパスし、宛先に沿って続行して実行する可能性は非常に低くなります。10mbps で10 個のエラー\秒を取得するとしましょう。これを 1 Gbps まで上げると、1 秒あたり 1,000 エラーが発生します。毎秒 1 エクサビットまでラムすると、エラー率は毎秒 1,000,000,000 エラーになります。1\1,000,000の衝突率があるとします。伝送エラー。つまり、100 万回に 1 回の伝送エラーが発生すると、破損したデータが検出されずに通過します。10mbps では、エラー データが 100,000 秒ごと、または 1 日に約 1 回送信されます。1 Gbps では、5 分に 1 回発生します。毎秒 1 エクサビットでは、1 秒間に数回話していることになります。
Wireshark を開くと、一般的なイーサネット ヘッダーに CRC32 があり、IP ヘッダーに CRC32 があり、TCP ヘッダーに CRC32 があることがわかります。これは、上位層のプロトコルが実行できることに加えてのものです。たとえば、IPSEC は、上記に加えて、整合性チェックに MD5 または SHA を使用する場合があります。典型的なネットワーク通信にはエラーチェックのレイヤーがいくつかありますが、10 mbps 未満の速度でも時々失敗します。
巡回冗長検査 (CRC) には、いくつかの一般的なバージョンといくつかの一般的でないバージョンがありますが、通常は、メッセージまたはファイルが転送中に破損した (複数のビットが反転する) ときに通知するように設計されています。CRC32 自体は、衝突率が高いため、大規模なスカラー エンタープライズ環境における今日の標準では、あまり優れたエラー チェック プロトコルではありません。平均的なユーザーのハード ドライブには 10 万以上のファイルがあり、企業のファイル共有には数千万のファイルがあります。ファイル数に対するハッシュスペースの比率が低すぎます。CRC32 は計算コストが低く実装できますが、MD5 はそうではありません。
MD5 は、衝突を意図的に使用して悪意のあるファイルを無害に見せることを防ぐように設計されています。ハッシュスペースが十分にマッピングされているため、一部の攻撃が発生する可能性があり、一部の衝突は予測可能であるため、安全ではないと見なされます。SHA1 と SHA2 はブロックの新しい子供です。
ファイル検証のために、Md5 は、マルチギガバイトのファイルまたはマルチテラバイトのファイルをすばやく処理し、一般的な OS の使用と CRC32 のサポートの上に積み重ねることができるため、多くのベンダーによって使用され始めています。今後 10 年以内に、ファイルシステムがエラー チェックに MD5 を使用し始めても驚かないでください。
CRC コードはよりシンプルで高速です。
何のために必要ですか?