最近、CRC32とMD5の両方が十分に均一で安定しているが、CRC32はMD5よりも効率的であることをどこかで読みました。 MD5は非常に一般的に使用されるハッシュアルゴリズムのようですが、CRC32の方が高速/メモリ効率が良い場合は、なぜそれを使用しないのですか?
MD5はone-way-hashアルゴリズムです。 One-way-hashアルゴリズムは、見つけるのが難しいプロパティ(設計ごと)があるため、暗号化でよく使用されます特定のハッシュ値を生成した入力。具体的には、同じ一方向ハッシュを与える2つの異なる入力を作成するのは困難です。それらは、ハッシュコードが生成されてからデータの量が意図的に変更されていないことを示す方法としてよく使用されます。 MD5はone-way-hashアルゴリズムであるため、速度よりもセキュリティに重点が置かれています。残念ながら、MD5は現在安全ではないと見なされています。
CRC32は、データの偶発的な変更を検出するように設計されており、ネットワークおよびストレージデバイスで一般的に使用されています。このアルゴリズムの目的は、意図的な変更から保護することではなく、ネットワークエラーやディスク書き込みエラーなどの事故をキャッチすることです。このアルゴリズムの重点は、セキュリティよりも速度にあります。
MD5に関するウィキペディアの記事 (強調鉱山):
MD5は広く使用されている暗号化ハッシュ関数
今 CRC32 :
CRCはエラー検出コード
したがって、ご覧のとおり、CRC32 ハッシュアルゴリズムではありませんです。つまり、ハッシュ用に構築されていないため、ハッシュに使用しないでください。
また、共通の使用について話すことはあまり意味がないと思います。なぜなら、同様のアルゴリズムは、目的が大きく異なり、要件も大きく異なるためです。一般的な使用に最適な単一のアルゴリズムはありません。代わりに、特定の使用に最も適したアルゴリズムを選択する必要があります。
CRC32とMD5の大きな違いの1つは、通常、CRC32チェックサムを選択し、メッセージに制約が課されている場合でも、そのチェックサムにハッシュするメッセージを簡単に作成できることです。困難なこと(年齢を示していますが、これは状況によっては可能になりました)。
攻撃者が特定のCRC32ハッシュを使用して座って他のメッセージを模倣したり、すべてのハッシュが同じであるためにハッシュテーブルのパフォーマンスを非常に低下させたりする可能性がある場合値の場合、MD5の方が適しています。 (さらに良いことに、IMHOは、それを使用するモジュールに固有で、外部で不明なキー付き値を持つHMAC-MD5です)。
CRCは、データ送信などのランダムエラーから保護するために使用されます。
暗号化ハッシュ関数は、メッセージを偽造するインテリジェントな攻撃者から保護するように設計されていますが、その点でMD5は壊れています。
それはあなたの目標次第です。以下に、CRC32とMD5でできることの例をいくつか示します。
重複ファイルの検出
2つのファイルが同じかどうかを確認する場合、CRC32ハッシュはMD5よりも高速であるため、進むべき方法です。ただし、注意してください。CRCは、バイナリが異なる場合にのみ確実に通知します。それらが同一であるかどうかは確実にわかりません。 2つのファイルに対して異なるハッシュを取得した場合、それらを同じファイルにすることはできません。そのため、重複として迅速に拒否できます。
キーが何であっても、CRC32ハッシュは2 ^ 32の異なる値のいずれかになります。ランダムなサンプルファイルを仮定すると、2つの指定されたファイルのハッシュ間の衝突の確率は1/2 ^ 32です。指定されたN個のファイル間の衝突の確率は、(N-1)/ 2 ^ 32です。
悪意のあるソフトウェアの検出
ファイルをダウンロードし、ソースのハッシュを自分のものと照合して有効かどうかを確認するなど、セキュリティが問題になる場合、CRCは適切ではありません。これは、攻撃者が同じCRCハッシュを持つマルウェアを作成するためです。この場合、MD5はより安全です-セキュリティのためにCRCは作成されませんでした。 2つの異なるバイナリは、CRCハッシュよりも異なるMD5ハッシュを持つ可能性が高くなります。
ユーザー認証のためのパスワードの保護
同期(一方向)暗号化は通常、非同期(2方向)暗号化よりも簡単、高速、安全です。したがって、パスワードを保存する一般的な方法です。基本的に、パスワードは他のデータ(塩)、時にはユーザー名と結合され、その後、結合されたすべてのデータでハッシュが実行されます。ランダムソルトは、2つのパスワードが同じになる可能性を大幅に減らします。デフォルトでは、ほとんどのアルゴリズムで同じパスワードに同じハッシュが使用されるため、独自のランダム性を追加する必要があります。もちろん、塩は外部から保存する必要があります。
あなたが見ることができないパスワードは何が良いですか?ユーザーのアカウントを確認するために表示する必要はありません。あなたは彼らがログインするときに彼らがあなたに提供する情報を取るだけです。あなたは彼らのユーザー名を使って彼らの塩を入手します。次に、このソルトをユーザーの資格情報(パスワードおよび場合によってはユーザー名)と組み合わせて、新しいハッシュを取得します。データベース内のものと一致する場合、ログインは成功します。これらのパスワードは保存しているため、非常に安全である必要があります。初期化ベクトル、反復ハッシュ、ランダム性理論などは言及しませんでした。
暗号化ハッシュはCRCよりも計算が高価です。また、sha256のようなより良いハッシュはより安全ですが、ハッシュが遅くなります。ちなみに、sha512ハッシュはsha256より高速です。
128ビット長のMD5を使用する必要があります。 CRC32の長さは32ビットのみであり、その目的は、ハッシュするのではなくエラーを検出することです。 32ビットのハッシュ関数のみが必要な場合は、MD5 LSB/MSB/Whateverによって返される32ビットを選択できます。
CRC32(またはCRC8、またはCRC16)があらゆる目的で使用される主な理由は、安価に実装できることです。 ハードウェアで データの「ランダムな」破損を検出する手段として。ソフトウェア実装でも、ハードウェアの原因(通信回線のノイズや信頼性の低いフラッシュメディアなど)からのデータのランダムな破損を検出する手段として役立ちます。改ざん防止ではなく、2つの任意のファイルが同じである可能性が高いかどうかをテストするのにも一般に適していません:ファイル内のデータの各チャンクの直後にそのチャンクのCRC32が続く場合(一部のデータ形式はそれを行います)チャンクは、そのチャンクに格納されているデータに関係なく、ファイル全体のCRCに対してすべてゼロバイトのチャンクと同じ効果を持ちます。
CRC32をすばやく計算する手段がある場合、同じCRCを持つ別のファイルが他のハッシュの1つとは異なる可能性が高いが、多くのマシンでは、他のチェックサムまたはハッシュメソッドと併用すると役立つ場合があります他のチェックサムまたはハッシュメソッドは、それらが提供する保護の量に比べて計算が容易になる可能性があります。
一人の男の共通点は別の男のまれです。共通は、作業しているフィールドによって異なります。
非常に高速な送信を行っている場合、または小さなアイテムのハッシュコードを処理している場合、CRCの方がはるかに高速であり、誤ったデータに対して同じ16ビットまたは32ビットCRCを取得する可能性が低いため、CRCの方が優れています。
たとえば、Linux ISOなどのメガバイトのデータの場合、数メガバイトを失っても同じCRCになってしまう可能性があります。 MD5ではそうではありません。そのため、通常、MD5は巨大な転送に使用されます。遅いですが、より信頼性があります。
したがって、基本的に、1回の巨大な送信を行い、最後に正しい結果が得られるかどうかを確認する場合は、MD5を使用します。小さなチャンクで送信する場合は、CRCを使用します。