web-dev-qa-db-ja.com

チェックサム対ハッシュ:相違点と類似点?

"checksum"アルゴリズムと"hash"関数の間のsimilaritiesおよびdifferencesとは何ですか?

お互いの代わりに使用できますか?またはそれらの使用法は異なりますか?

たとえば、テキストの整合性を検証する場合、どちらを使用するのが適切ですか?

そして、それらが異なる場合、それぞれについて特定のアルゴリズムとは何ですか? "checksum"に適したアルゴリズムと"hash"関数に適したアルゴリズムはどれですか。

9
Questioner

checksum(CRC32など)は、偶発的な変更を防ぐためのものです。 1バイトが変化すると、チェックサムが変化します。チェックサムは悪意のある変更から保護するのに安全ではありません。特定のチェックサムを含むファイルを作成するのは非常に簡単です。

ハッシュ関数は、一部のデータを他のデータにマップします。比較を高速化したり、ハッシュテーブルを作成したりするためによく使用されます。すべてのハッシュ関数が安全であるわけではなく、データが変更されてもハッシュは必ずしも変更されません。

暗号化ハッシュ関数(SHA1など)は、悪意のある変更から保護されたチェックサムです。特定の暗号化ハッシュを含むファイルを作成するのはかなり困難です。

物事をより複雑にするために、暗号化ハッシュ関数は単にハッシュ関数と呼ばれることもあります。

12
Sjoerd

「チェックサム」アルゴリズムと「ハッシュ」関数の類似点と相違点は何ですか?

チェックサムは、何かが同じかどうかを判断するために使用されます。

ファイルをダウンロードした場合、ファイルがマシンに向かう途中で破損したかどうかを確認することはできません。 cksumを使用して、現在持っているコピーのチェックサム(CRC-32に基づく)を計算し、次に比較して、ファイルのチェックサム。これは、ファイルの整合性を確認する方法です。

ハッシュ関数は、ある日付を固定サイズの別の日付にマッピングするために使用されます。 完全なハッシュ関数 は単射なので、衝突はありません。すべての入力には1つの固定出力があります。

検証には暗号化ハッシュ関数が使用されます。暗号化ハッシュ関数を使用すると、元の入力を計算できないようにする必要があります。

非常に一般的な使用例は、パスワードハッシュです。これにより、パスワード自体を保存せずにパスワードを検証できます。サービスプロバイダーはパスワードのハッシュのみを保存し、元のパスワードを計算できません。パスワードハッシュのデータベースが危険にさらされた場合、攻撃者はこれらのパスワードも計算できないはずです。パスワードハッシュには強力なアルゴリズムと弱いアルゴリズムがあるため、これは当てはまりません。詳細については、このサイトをご覧ください。

TL; DR:

チェックサムを使用して、2つの情報を比較して、2つのパーティがcheckかどうかを比較します。まったく同じものを持っています。

ハッシュはverifyに(暗号化で)使用されますが、今回は意図的に、検証する必要がある日付にアクセスできるのは1つのパーティーだけですが、相手はハッシュにのみアクセスできます。

4
Tom K.

それらは基本的に同じものですが、チェックサムは小さくなる傾向があります(数バイト)。

完全性

ハッシュ関数とチェックサムの両方を使用して、データの整合性を検証します。暗号化ハッシュ関数は、衝突が不明なハッシュ関数です。これが、MACのようなものを構築するために暗号化ハッシュ関数が使用される理由です(以下を参照)。

情報の損失

ハッシュ関数とチェックサムのもう1つの特性は、計算中に情報が失われることです。一部のデータをより少ないビット数のチェックサム/ハッシュに変換する場合、これは当てはまります。これは、チェックサムやハッシュだけでは元のデータに戻れない理由でもあります。

[〜#〜] hmac [〜#〜]

私が探しているのはMAC(メッセージ認証コード)です。このようなコードは、データの改ざんを検出するために使用されます。ほとんどの場合、それはハッシュ関数とパスワードのような秘密の値の組み合わせです。以下も参照してください。

https://en.wikipedia.org/wiki/Message_authentication_code

パスワード

パスワードはハッシュとして保存されることがあります。パスワードを検証するために、入力したパスワードのハッシュが計算され、保存されているパスワードハッシュと比較されます。チェックサムは一般に短く、衝突が発生しやすいため、そのようなものには使用されません。つまり、ランダムなパスワードを試して、入力に元のパスワードと同じチェックサムがある可能性があります。

ただし、通常の(ダイジェスト)ハッシュ関数を使用することは、パスワードを保存する正しい方法ではないことに注意してください。データをすばやく消化するために作成されているため、攻撃者はこれらのハッシュを高速でクラックできます。プログラマは、bcryptやArgon2など、パスワードを保存するために設計されたハッシュ関数を使用する必要があります。

編集:アルゴリズムの例

特定のアルゴリズムに関する最後の質問に答えるには、ハッシュ関数をリストしているウィキペディアのページをご覧ください。上で述べたように、それらは基本的に同じです。ウィキペディアでは、チェックサムはハッシュ関数のサブセットとしてリストされています。

https://en.wikipedia.org/wiki/List_of_hash_functions

2
Graa

上記に2つの実用的な例を追加しましょう。

チェックサム:これらは、データの偶発的な変更を検出するように設計されています。この良い例がチェックサムTCP/IPで使用です。シンプルで非常に高速です(各パケットがチェックされます)。チェックサムが別のメッセージと等しいメッセージを悪意を持って作成することは比較的簡単です。

ハッシュ:これらは、データを固定長にマップするために使用される一方向関数です。多くの場合、ネットワークを介して送信する必要なく、大量のデータを比較するために使用されます。この良い例がBitTorrentです。ダウンロードが完了すると、ハッシュを計算して照合することにより、データのバージョンを元のバージョンと比較します。

「チェックサム」アルゴリズムと「ハッシュ」関数の類似点と相違点は何ですか?

同様に、どちらも確定的で、可変サイズのデータ​​を固定サイズにマッピングできます。保証は異なりますが、どちらも同じかどうかを確認するために使用できます。違いについては、上記を参照してください。

お互いの代わりに使用できますか?またはそれらの使用法は異なりますか?

彼らはすべきではありません。上記を参照。

たとえば、テキストの整合性を検証する場合、どちらを使用するのが適切ですか?

それはあなたが何をしたいかによります。業界では、両方を使用して「整合性」を確認しています(上記の例を参照)。

  • ランダムなエラーを検出するには、チェックサムを使用します
  • 大きなデータセットを比較するには、ハッシュを使用します
  • 整合性のために、SHA256などの暗号化ハッシュ関数を備えたHMACを使用します

データの整合性についての穏やかな紹介については、 この記事 をお読みください。

1
Daniel Szpisjak