web-dev-qa-db-ja.com

CRCはMD5 / SHA1よりもいつ使用するのが適切ですか?

MD5やSHA1などの最新のハッシュ関数に対して、エラー検出にCRCを使用するのが適切なのはいつですか?前者は組み込みハードウェアに実装する方が簡単ですか?

117
Gili

CRCは、ネットワーク干渉、回線ノイズ、歪みなどから発生する可能性のあるデータのランダムエラーを検出するのに適切に機能します。

CRCは、MD5またはSHA1よりも計算上複雑ではありません。 MD5のようなハッシュ関数を使用することは、おそらくランダムエラー検出にとってはやり過ぎです。ただし、あらゆる種類のセキュリティチェックにCRCを使用すると、MD5などのより複雑なハッシュ関数よりも安全性が低下します。

はい、CRCは組み込みハードウェアに実装するのがはるかに簡単です。ICでこのためのさまざまなパッケージソリューションを入手することもできます。

103
defines

CRCは、データの意図しない変更に対して設計されています。つまり、意図しないエラーの検出には適していますが、データが悪意を持って処理されていないことを確認する方法としては役に立ちません。

this も参照してください。

29
Liran Orevi

howinappropriateCRCハッシュがハッシュテーブル用である を示す研究を見つけました。また、アルゴリズムの実際の特性についても説明します。 調査 には、他のハッシュアルゴリズムの評価も含まれており、保持するのに適したリファレンスです。

ハッシュのCRCに関する関連する結論:

CRC32は、ハッシュテーブルの使用を目的としていませんでした。この目的で使用する正当な理由は本当にないので、使用しないことをお勧めします。 CRC32を使用することにした場合、キーオクテットが入力されるのとは反対側からハッシュビットを使用することが重要です。これは特定のCRC32実装に依存します。 CRC32を「ブラックボックス」ハッシュ関数として扱わず、汎用ハッシュとして使用しないでください。適合性について、各アプリケーションを必ずテストしてください。

[〜#〜] update [〜#〜]

サイトがダウンしているようです。 インターネットアーカイブにはコピーがあります しかし。

19
Andre Luus

これのすべての行を実行しました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」は次の理由で使用しないでください。

    1. セキュリティを気にするときのセキュリティ問題
    2. 必要なのはCRCだけである場合、ハッシュ文字列が長く、「crc32b」よりも遅い
17
Martin

実装、速度、および信頼性に関するCRC情報については、 CRCエラー検出アルゴリズムの簡単なガイド を参照してください。 CRCのすべてが含まれています。

誰かがあなたのデータを悪意を持って変更しようとして、変更を隠そうとしない限り、CRCで十分です。 「良い」(標準の)政治を使用してください。

10
Gerhard

あなたが保護しようとしているということは何も言わない。

CRCは、悪意のあるシステムの変更を防ぐのではなく、偶発的なデータ破損のチェックとして組み込みシステムでよく使用されます。 CRCが役立つ可能性のある場所の例は、ファームウェアの破損を防ぐために、システムの初期化中にEPROMイメージを検証することです。システムブートローダーは、アプリケーションコードのCRCを計算し、コードの実行を許可する前に保存されている値と比較します。これにより、偶発的なプログラムの破損やダウンロードの失敗の可能性から保護されます。

CRCを同様の方法で使用して、FLASHまたはEEPROMに保存されている構成データを保護することもできます。 CRCが正しくない場合、データに無効のフラグを立て、デフォルトまたはバックアップデータセットを使用できます。 CRCは、デバイスの障害、または構成データストアの更新中にユーザーが電源を切ったために無効になる場合があります。

ハッシュは、複数ビットエラーのあるCRCよりも破損を検出する可能性が高いというコメントがあります。これは事実であり、16ビットまたは32ビットCRCを使用するかどうかの決定は、使用されている破損したデータブロックの安全性の結果と、1の2 ^ 16または2 ^ 32の可能性データブロックが誤って有効と宣言されています。

多くのデバイスには、標準アルゴリズム用のCRCジェネレーターが組み込まれています。テキサスのMSP430F5Xシリーズには、CRC-CCITT標準のハードウェア実装があります。

8
uɐɪ

CRC32はより高速で、ハッシュの長さはわずか32ビットです。

迅速で軽いチェックサムが必要な場合に使用します。 CRCはイーサネットで使用されます。

より信頼性が必要な場合は、最新のハッシュ関数を使用することをお勧めします。

6
François

それはすべて、要件と期待に依存します。

これらの ハッシュ関数 アルゴリズムの簡単な簡単な違いを次に示します。

[〜#〜] crc [〜#〜] (CRC-8/16/32/64)

  • not暗号化ハッシュアルゴリズム(巡回冗長検査に基づく線形関数を使用)
  • 9、17、33、65ビットのいずれかを生成できます
  • 暗号化の保証がないため、暗号化の目的で使用することを意図していません。
  • 簡単に元に戻すことができるため、デジタル署名での使用には不適切2006
  • 暗号化の目的で使用しないでください。
  • 異なる文字列が衝突を生成する可能性があり、
  • 1961年に発明され、イーサネットおよび他の多くの標準で使用され、

MD5

  • 暗号化ハッシュアルゴリズムです。
  • 128ビット(16バイト)ハッシュ値(32桁の16進数)の生成
  • 暗号化ハッシュですが、セキュリティが心配な場合は非推奨と見なされます。
  • 同じMD5ハッシュ値を持つ既知の文字列があります
  • 暗号化の目的に使用できますが、

SHA-1

  • 暗号化ハッシュアルゴリズムです。
  • メッセージダイジェストと呼ばれる160ビット(20バイト)のハッシュ値を生成します
  • これは暗号化ハッシュであり、2005年以降、安全とは見なされなくなりました。
  • 暗号化の目的に使用できますが、
  • sha1衝突の例が見つかりました
  • 最初に1993年に(SHA-0として)、次に1995年にSHA-1として公開されました。
  • シリーズ:SHA-0、SHA-1、SHA-2、SHA-3、

    要約すると、SHA-1の使用は、資金の豊富な相手に対して安全であるとは見なされなくなりました。これは、2005年に暗号解読者がSHA-1に対する攻撃を発見したためです。シュナイアー。 U.S. NISTは、連邦政府機関が衝突抵抗を必要とするアプリケーションでSHA1-1の使用を停止し、2010年以降はSHA-2を使用する必要があることを助言します[〜#〜] nist [〜#〜]

したがって、ファイルの整合性をチェックするための簡単で迅速なソリューション(破損に対する)を探している場合、またはパフォーマンスの観点からいくつかの単純なキャッシュの目的のために、使用することを考慮したハッシュのためにCRC-32を検討することができますただし、MD5は、衝突の可能性を避けるために(安全で一貫性のある)プロフェッショナルアプリケーションを開発している場合は、SHA-2以上(SHA-3など)を使用します。

性能

PHPの簡単なベンチマークテスト:

# Testing static text.

$ time php -r 'for ($i=0;$i<1000000;$i++) crc32("foo");'
real    0m0.845s
user    0m0.830s
sys     0m0.008s

$ time php -r 'for ($i=0;$i<1000000;$i++) md5("foo");'
real    0m1.103s
user    0m1.089s
sys     0m0.009s

$ time php -r 'for ($i=0;$i<1000000;$i++) sha1("foo");'
real    0m1.132s
user    0m1.116s
sys   0m0.010s

# Testing random number. 

$ time php -r 'for ($i=0;$i<1000000;$i++) crc32(Rand(0,$i));'
real    0m1.754s
user    0m1.735s
sys     0m0.012s\

$ time php -r 'for ($i=0;$i<1000000;$i++) md5(Rand(0,$i));'
real    0m2.065s
user    0m2.042s
sys     0m0.015s

$ time php -r 'for ($i=0;$i<1000000;$i++) sha1(Rand(0,$i));'
real    0m2.050s
user    0m2.021s
sys     0m0.015s

関連する:

6
kenorb

CRCを使用するのは、計算リソースが非常に狭い場合(埋め込み環境など)、または多くの出力値を保存/転送する必要があり、スペース/帯域幅が狭い場合のみです(CRCは通常32ビットで、MD5出力は128ビット、SHA1 160ビット、その他SHA 512ビットまでのバリアント)。

CRCは「偽造」が非常に簡単なので、セキュリティチェックにCRCを使用しないでください。

偶発的なエラー検出(悪意のある変更の検出ではなく)の場合でも、ハッシュは単純なCRCよりも優れています。部分的にはCRCの簡単な計算方法のため(また、CRC値は一般的なハッシュ出力よりも短いため、可能な値の範囲がはるかに狭いため)、2つ以上のエラーがある状況では、 、1つのエラーが別のエラーをマスクするため、2つのエラーにもかかわらず同じCRCになります。

要するに、まともなハッシュアルゴリズムを使用する理由notがなければ、単純なCRCを避けてください。

5
David Spillett

最近、CRCの使用に出会いました。 jdupe ファイル複製識別および削除ツールの作成者(一般的なexifツールjheadの同じ作成者)は、ファイルを最初に通過するときにこのファイルを使用します。 CRCは各ファイルの最初の32Kで計算され、同じように見えるファイルをマークします。また、ファイルは同じサイズでなければなりません。これらのファイルは、完全なバイナリ比較を行うファイルのリストに追加されます。大きなメディアファイルのチェックを高速化します。

5
John Wright

基本から始めましょう。

暗号化では、ハッシュアルゴリズムはダイジェスト操作により多くのビットをより少ないビットに変換します。ハッシュは、メッセージとファイルの整合性を確認するために使用されます。

すべてのハッシュアルゴリズムが衝突を生成します。衝突とは、複数の多ビットの組み合わせが同じより少ないビット出力を生成する場合です。ハッシュアルゴリズムの暗号強度は、個人が特定の入力に対して出力がどうなるかを判断できないことによって定義されます。これは、正当なファイルと一致するハッシュを持つファイルを作成し、想定される整合性を損なう可能性があるためです。システムの。 CRC32とMD5の違いは、MD5が生成するハッシュが大きく、予測が難しいことです。

メッセージの整合性を実装する場合(送信中にメッセージが改ざんされていないことを意味する場合)、衝突を予測できないことは重要な特性です。 32ビットハッシュは、40億の異なるメッセージまたは40億の異なる一意のハッシュ。 40億と1つのファイルがある場合、1つのコリジョンが確実に発生します。 1 TB Bitspaceには、Billionions of Collisionsの可能性があります。私が攻撃者であり、その32ビットハッシュがどうなるかを予測できる場合、ターゲットファイルと衝突する感染ファイルを作成できます。それは同じハッシュを持っています。

さらに、10mbpsの伝送を行っている場合、パケットが破損してcrc32をバイパスし、宛先に沿って継続して実行する可能性は非常に低くなります。 10mbpsで10個のエラー\秒を得たとしましょう。これを1gbpsまで上げると、1秒あたり1,000エラーになります。 1秒あたり最大1エクサビットを実行すると、エラーレートは1,000,000,000エラー/秒になります。 1\1,000,000の送信エラーの衝突率があるとします。100万の送信エラーの1つは、破損したデータが検出されないことを意味します。 10mbpsでは、100,000秒ごとに、または1日に1回、エラーデータが送信されます。 1gbpsでは、5分ごとに1回発生します。 1秒あたり1エクサビットで、1秒間に数回話します。

Wiresharkを開くと、通常のイーサネットヘッダーにCRC32があり、IPヘッダーにCRC32があり、TCPヘッダーにCRC32があります。これは、上位層のプロトコルに加えて行う;例えばIPSECは、上記に加えて整合性チェックにMD5またはSHAを使用する場合があります。一般的なネットワーク通信にはいくつかのエラーチェックレイヤーがあり、それらは今でもサブ10 mbpsの速度で途方に暮れています。

巡回冗長検査(CRC)には、いくつかの一般的なバージョンといくつかの珍しいものがありますが、通常、メッセージまたはファイルが送信中に破損したことを通知するように設計されています(複数ビット反転)。 CRC32自体は、衝突率のために、大規模なスカラーエンタープライズ環境での今日の標準では、非常に優れたエラーチェックプロトコルではありません。平均的なユーザーのハードドライブには100,000以上のファイルがあり、企業のファイル共有には数千万のファイルがあります。ハッシュスペースとファイル数の比率が低すぎます。 CRC32の実装は計算的に安価ですが、MD5はそうではありません。

MD5は、衝突の意図的な使用を停止して、悪意のあるファイルを無害に見せるように設計されました。ハッシュスペースは十分にマッピングされているため、一部の攻撃が発生し、一部の衝突は予測可能であるため、安全ではないと見なされます。 SHA1とSHA2は、ブロック上の新しい子供たちです。

ファイル検証のために、Md5は多くのベンダーによって使用され始めています。これは、マルチギガバイトファイルまたはマルチテラバイトファイルをすばやく使用して、一般的なOSの使用とCRC32のサポートの上にスタックできるためです。今後10年以内にファイルシステムがエラーチェックにMD5を使用し始めても驚かないでください。

4
bobinator

CRC32ははるかに高速であり、ハードウェアサポートもあります(つまり、Nehalemプロセッサ上)。実際に使用するのは、ハードウェアとのインターフェイスを使用している場合、またはreallyパフォーマンスが厳しい場合のみです

4
Paul Betts

CRCコードはよりシンプルで高速です。

何が必要ですか?

1
Macarse