回答:
CRCは、ネットワーク干渉、回線ノイズ、歪みなどから発生する可能性のあるデータのランダムエラーを検出するために適切に機能します。
CRCはMD5やSHA1よりも計算がはるかに簡単です。MD5のようなハッシュ関数を使用すると、ランダムなエラー検出にはおそらくやり過ぎです。ただし、任意の種類のセキュリティチェックにCRCを使用すると、MD5などのより複雑なハッシュ関数よりもはるかに安全性が低くなります。
そしてはい、CRCは組み込みハードウェアに実装する方がはるかに簡単です。これをICでパッケージ化したさまざまなソリューションを入手することもできます。
MD5
でSHA-1
ください。また、回避する必要がありますSHA-2
。いくつかのバリアントをお勧めします。
ハッシュテーブルのCRCハッシュがいかに不適切であるかを示す調査結果を見つけました。また、アルゴリズムの実際の特性についても説明します。この調査には、他のハッシュアルゴリズムの評価も含まれているので、参考にしてください。
ハッシュのCRCに関する関連する結論:
CRC32はハッシュテーブルの使用を意図したものではありません。これをこの目的で使用する十分な理由はありません。使用しないことをお勧めします。CRC32を使用する場合は、キーオクテットが入力される側とは反対側の端からハッシュビットを使用することが重要です。どちらの端がどちらであるかは、特定のCRC32実装によって異なります。CRC32を「ブラックボックス」ハッシュ関数として扱わないでください。また、CRC32を汎用ハッシュとして使用しないでください。アプリケーションの適合性を必ずテストしてください。
更新
サイトがダウンしているようです。インターネットアーカイブにはコピーを持っているのに。
この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」は次の理由により使用しないでください。
"The quick brown fox jumped over the lazy dog."
)に適用される場合、MD5よりもはるかに高速なCRCがわかります。
実装、速度、信頼性に関するCRC情報については、CRCエラー検出アルゴリズムの簡単なガイドを参照してください。。CRCに関するすべてを備えています。
誰かが悪意を持ってデータを変更しようとしない限り、変更を隠しますCRCで十分です。"Good"(標準)ポリノミアルを使用してください。
それはすべて、要件と期待に依存します。
これらのハッシュ関数アルゴリズムの簡単な違いは次のとおりです。
暗号化ハッシュアルゴリズムです。
メッセージダイジェストと呼ばれる160ビット(20バイト)のハッシュ値を生成します
これは暗号化ハッシュであり、2005年以降は安全とは見なされなくなりました。
暗号化の目的で使用でき、
1993年に最初に公開され(SHA-0として)、1995年にSHA-1として公開されました
シリーズ:SHA-0、SHA-1、SHA-2、SHA-3、
2005年には、暗号解読は、それが継続的な使用のために安全ではない十分かもしれ示唆SHA-1への攻撃見つけたので要約すると、SHA-1を使用することは、もはや、よく資金を供給相手に対して安全と見なされていないシュナイアーを。US NISTは、連邦機関は衝突耐性を必要とするアプリケーションではSHA1-1の使用を停止し、2010 NIST以降はSHA-2を使用する必要があることを推奨しています。
したがって、ファイルの整合性をチェックするための(破損に対して)シンプルで迅速なソリューションを探している場合、またはパフォーマンスの観点から単純なキャッシュを目的としている場合は、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が役立つ場所の例は、システムの初期化中にEPROMイメージを検証して、ファームウェアの破損を防ぐことです。システムブートローダーは、アプリケーションコードのCRCを計算し、コードの実行を許可する前に格納された値と比較します。これにより、プログラムの偶発的な破損やダウンロードの失敗の可能性を防ぎます。
CRCを同様の方法で使用して、FLASHまたはEEPROMに保存されている構成データを保護することもできます。CRCが正しくない場合、データに無効のフラグが付けられ、デフォルトまたはバックアップデータセットが使用されます。デバイスの障害のため、または構成データストアの更新中にユーザーが電源を切断した場合、CRCは無効になる可能性があります。
ハッシュは、複数のビットエラーのあるCRCよりも破損を検出する可能性が高いというコメントがあります。これは真実であり、16ビットまたは32ビットのCRCを使用するかどうかの決定は、使用されている破損したデータブロックの安全性の結果と、1の2 ^ 16または2 ^ 32の確率を正当化できるかどうかにかかっています。データブロックが有効であると誤って宣言されています。
多くのデバイスには、標準アルゴリズム用の組み込みCRCジェネレーターがあります。テキサスのMSP430F5Xシリーズは、CRC-CCITT標準のハードウェア実装を備えています。
計算リソースが非常に狭い場合(つまり、一部の埋め込み環境)、または多くの出力値を格納/転送する必要があり、スペース/帯域幅が狭い場合にのみCRCを使用します(CRCは通常32ビットであり、MD5出力は128ビットで、SHA1 160です。ビット、および最大512ビットの他のSHAバリアント)。
CRCは「偽造」が非常に簡単であるため、セキュリティチェックにCRCを使用しないでください。
(悪意のある変更の検出ではなく)偶発的なエラー検出の場合でも、ハッシュは単純なCRCよりも優れています。CRCが計算される単純な方法が原因で(およびCRC値が通常のハッシュ出力よりも通常短いため、可能な値の範囲がはるかに小さいため)、2つ以上のエラーがある状況では、 、1つのエラーが別のエラーをマスクするため、2つのエラーがあっても同じCRCになります。
つまり、まともなハッシュアルゴリズムを使用しない理由がない限り、単純なCRCは避けてください。
最近、スマートなCRCの使用法に遭遇しました。著者jdupeのファイルの重複識別および除去ツール(人気のEXIFツールjheadの同じ作者)は、ファイルを最初に通過する間にそれを使用しています。CRCは各ファイルの最初の32Kで計算され、同じように見えるファイルをマークします。また、ファイルは同じサイズでなければなりません。これらのファイルは、完全なバイナリ比較を行うファイルのリストに追加されます。大きなメディアファイルのチェックを高速化します。
基本から始めましょう。
暗号化では、ハッシュアルゴリズムは、ダイジェスト操作によって多くのビットをより少ないビットに変換します。ハッシュは、メッセージとファイルの整合性を確認するために使用されます。
すべてのハッシュアルゴリズムは衝突を生成します。衝突とは、いくつかの多くのビットの組み合わせが同じより少ないビット出力を生成する場合です。ハッシュアルゴリズムの暗号強度は、特定の入力に対して出力がどうなるかを個人が判断できないことによって定義されます。これは、正当なファイルと一致するハッシュでファイルを作成し、想定される整合性を損なう可能性があるためです。システムの。CRC32とMD5の違いは、MD5が生成するハッシュが大きくなり、予測が困難になることです。
メッセージの整合性を実装する場合、つまりメッセージが転送中に改ざんされていない場合、衝突を予測できないことは重要な特性です。32ビットのハッシュを記述することができます40億異なるメッセージ 40億異なるユニークなハッシュを使用するか、ファイルを。40億と1つのファイルがある場合、1回の衝突が保証されます。1 TBのビットスペースには、何十億もの衝突の可能性があります。私が攻撃者であり、その32ビットハッシュがどうなるかを予測できる場合、ターゲットファイルと衝突する感染ファイルを作成できます。同じハッシュを持っています。
さらに、10 Mbpsの転送を行っている場合、パケットが破損してcrc32をバイパスし、宛先に沿って続行して実行される可能性は非常に低くなります。10mbpsで10個のエラー\秒を取得するとします。それを1 Gbpsに上げると、毎秒1,000エラーが発生します。毎秒最大1エクサビットに達すると、毎秒1,000,000,000エラーのエラー率になります。 1 \ 1,000,000だとします送信エラーの衝突率があるとします。つまり、100万分の1の送信エラーにより、破損したデータが検出されずに通過します。10 Mbpsでは、エラーデータが100,000秒ごと、または1日に1回送信されます。1 Gbpsでは5分に1回発生します。毎秒1エクサビットで、1秒間に数回話しています。
Wiresharkをポップオープンすると、通常のイーサネットヘッダーにCRC32があり、IPヘッダーにCRC32があり、TCPヘッダーにCRC32があることがわかります。これは、上位層のプロトコルの機能に加えて、たとえば、IPSECは、上記に加えて、整合性チェックにMD5またはSHAを使用する場合があります。一般的なネットワーク通信にはエラーチェックのいくつかのレイヤーがあり、それらは10mbps未満の速度で時々失敗します。
巡回冗長検査(CRC)には、いくつかの一般的なバージョンといくつかの一般的でないバージョンがありますが、一般に、メッセージまたはファイルが転送中に破損した(マルチビットフリッピング)ときに通知するように設計されています。CRC32自体は、衝突率が原因で、大規模なスカラーエンタープライズ環境における今日の標準では、非常に優れたエラーチェックプロトコルではありません。平均的なユーザーのハードドライブは10万以上のファイルを持つことができ、会社でのファイル共有は数千万になることがあります。ファイルの数に対するハッシュスペースの比率が低すぎます。CRC32は実装が計算的に安価ですが、MD5はそうではありません。
MD5は、意図的な衝突の使用を停止して、悪意のあるファイルを無害に見えるように設計されています。ハッシュスペースが十分にマッピングされており、攻撃が発生したり、衝突が予測されたりする可能性があるため、安全ではないと考えられています。SHA1とSHA2は、ブロックの新しい子供です。
Md5は、マルチギガバイトのファイルやマルチテラバイトのファイルをすばやく作成し、一般的なOSでの使用とCRC32のサポートに重ねることができるため、ファイル検証で多くのベンダーによって使用され始めています。今後10年以内にファイルシステムがエラーチェックにMD5を使用し始めても驚かないでください。