MD5やSHA1などの最新のハッシュ関数に対して、エラー検出にCRCを使用するのが適切なのはいつですか?前者は組み込みハードウェアに実装する方が簡単ですか?
CRCは、ネットワーク干渉、回線ノイズ、歪みなどから発生する可能性のあるデータのランダムエラーを検出するのに適切に機能します。
CRCは、MD5またはSHA1よりも計算上複雑ではありません。 MD5のようなハッシュ関数を使用することは、おそらくランダムエラー検出にとってはやり過ぎです。ただし、あらゆる種類のセキュリティチェックにCRCを使用すると、MD5などのより複雑なハッシュ関数よりも安全性が低下します。
はい、CRCは組み込みハードウェアに実装するのがはるかに簡単です。ICでこのためのさまざまなパッケージソリューションを入手することもできます。
CRCは、データの意図しない変更に対して設計されています。つまり、意図しないエラーの検出には適していますが、データが悪意を持って処理されていないことを確認する方法としては役に立ちません。
this も参照してください。
howinappropriateCRCハッシュがハッシュテーブル用である を示す研究を見つけました。また、アルゴリズムの実際の特性についても説明します。 調査 には、他のハッシュアルゴリズムの評価も含まれており、保持するのに適したリファレンスです。
ハッシュのCRCに関する関連する結論:
CRC32は、ハッシュテーブルの使用を目的としていませんでした。この目的で使用する正当な理由は本当にないので、使用しないことをお勧めします。 CRC32を使用することにした場合、キーオクテットが入力されるのとは反対側からハッシュビットを使用することが重要です。これは特定のCRC32実装に依存します。 CRC32を「ブラックボックス」ハッシュ関数として扱わず、汎用ハッシュとして使用しないでください。適合性について、各アプリケーションを必ずテストしてください。
[〜#〜] update [〜#〜]
サイトがダウンしているようです。 インターネットアーカイブにはコピーがあります しかし。
これのすべての行を実行しました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
私の結論:
セキュリティレイヤーを追加する必要がある場合は、「sha256」(またはそれ以上)を使用します。
「md5」または「sha1」は次の理由で使用しないでください。
実装、速度、および信頼性に関するCRC情報については、 CRCエラー検出アルゴリズムの簡単なガイド を参照してください。 CRCのすべてが含まれています。
誰かがあなたのデータを悪意を持って変更しようとして、変更を隠そうとしない限り、CRCで十分です。 「良い」(標準の)政治を使用してください。
あなたが保護しようとしているということは何も言わない。
CRCは、悪意のあるシステムの変更を防ぐのではなく、偶発的なデータ破損のチェックとして組み込みシステムでよく使用されます。 CRCが役立つ可能性のある場所の例は、ファームウェアの破損を防ぐために、システムの初期化中にEPROMイメージを検証することです。システムブートローダーは、アプリケーションコードのCRCを計算し、コードの実行を許可する前に保存されている値と比較します。これにより、偶発的なプログラムの破損やダウンロードの失敗の可能性から保護されます。
CRCを同様の方法で使用して、FLASHまたはEEPROMに保存されている構成データを保護することもできます。 CRCが正しくない場合、データに無効のフラグを立て、デフォルトまたはバックアップデータセットを使用できます。 CRCは、デバイスの障害、または構成データストアの更新中にユーザーが電源を切ったために無効になる場合があります。
ハッシュは、複数ビットエラーのあるCRCよりも破損を検出する可能性が高いというコメントがあります。これは事実であり、16ビットまたは32ビットCRCを使用するかどうかの決定は、使用されている破損したデータブロックの安全性の結果と、1の2 ^ 16または2 ^ 32の可能性データブロックが誤って有効と宣言されています。
多くのデバイスには、標準アルゴリズム用のCRCジェネレーターが組み込まれています。テキサスのMSP430F5Xシリーズには、CRC-CCITT標準のハードウェア実装があります。
CRC32はより高速で、ハッシュの長さはわずか32ビットです。
迅速で軽いチェックサムが必要な場合に使用します。 CRCはイーサネットで使用されます。
より信頼性が必要な場合は、最新のハッシュ関数を使用することをお勧めします。
それはすべて、要件と期待に依存します。
これらの ハッシュ関数 アルゴリズムの簡単な簡単な違いを次に示します。
シリーズ: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
関連する:
CRCを使用するのは、計算リソースが非常に狭い場合(埋め込み環境など)、または多くの出力値を保存/転送する必要があり、スペース/帯域幅が狭い場合のみです(CRCは通常32ビットで、MD5出力は128ビット、SHA1 160ビット、その他SHA 512ビットまでのバリアント)。
CRCは「偽造」が非常に簡単なので、セキュリティチェックにCRCを使用しないでください。
偶発的なエラー検出(悪意のある変更の検出ではなく)の場合でも、ハッシュは単純なCRCよりも優れています。部分的にはCRCの簡単な計算方法のため(また、CRC値は一般的なハッシュ出力よりも短いため、可能な値の範囲がはるかに狭いため)、2つ以上のエラーがある状況では、 、1つのエラーが別のエラーをマスクするため、2つのエラーにもかかわらず同じCRCになります。
要するに、まともなハッシュアルゴリズムを使用する理由notがなければ、単純なCRCを避けてください。
最近、CRCの使用に出会いました。 jdupe ファイル複製識別および削除ツールの作成者(一般的なexifツールjheadの同じ作成者)は、ファイルを最初に通過するときにこのファイルを使用します。 CRCは各ファイルの最初の32Kで計算され、同じように見えるファイルをマークします。また、ファイルは同じサイズでなければなりません。これらのファイルは、完全なバイナリ比較を行うファイルのリストに追加されます。大きなメディアファイルのチェックを高速化します。
基本から始めましょう。
暗号化では、ハッシュアルゴリズムはダイジェスト操作により多くのビットをより少ないビットに変換します。ハッシュは、メッセージとファイルの整合性を確認するために使用されます。
すべてのハッシュアルゴリズムが衝突を生成します。衝突とは、複数の多ビットの組み合わせが同じより少ないビット出力を生成する場合です。ハッシュアルゴリズムの暗号強度は、個人が特定の入力に対して出力がどうなるかを判断できないことによって定義されます。これは、正当なファイルと一致するハッシュを持つファイルを作成し、想定される整合性を損なう可能性があるためです。システムの。 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を使用し始めても驚かないでください。
CRC32ははるかに高速であり、ハードウェアサポートもあります(つまり、Nehalemプロセッサ上)。実際に使用するのは、ハードウェアとのインターフェイスを使用している場合、またはreallyパフォーマンスが厳しい場合のみです
CRCコードはよりシンプルで高速です。
何が必要ですか?