2つのアルゴリズムの違いは何ですか?
私が知っている1つの違いは、MACはキー付きで、ハッシュはキー付きではないということです。
簡単にするために、通常、MACは秘密鍵で暗号化されたハッシュ値です。たとえば、攻撃者がメッセージを偽造して新しいハッシュを計算することはできますが、システムがハッシュを秘密鍵で暗号化する必要がある場合、攻撃者はそれを行うことができません。
暗号化ハッシュ関数 は、誰でも任意の入力に対して計算できる完全に公開された確定的なハッシュ関数です。入力としてビットのシーケンス(任意のビットのシーケンス。一部のハッシュ関数は、正式には2未満の入力に限定されています)64 ビット、別名「200万テラバイト」)であり、かなり小さなスペースで値を出力します。通常は、固定サイズのビットのシーケンスです(たとえば、標準のハッシュ関数で常に160ビット SHA-1 )。優れた暗号化ハッシュ関数は、入力データを非常に完全に混合して後で理解することができないという非公式に要約されるいくつかの条件を尊重します。
メッセージ認証コード は、メッセージと秘密鍵を入力として受け取り、後でメッセージと一致するかどうか検証できる固定サイズの出力を生成するアルゴリズムです。検証にも同じ秘密鍵が必要です。すべてが既知であり、攻撃者が数学と戦っているハッシュ関数とは対照的に、MACは、秘密の知識を持つエンティティが存在するモデルでは理にかなっています。優れたMACに期待できるのは偽造不可です。指定されたキー[〜#〜] k [〜#〜][〜#〜] k [〜#〜]を正確に、そして完全に知ることなく。
したがって、ハッシュ関数とMACは、異なるプロパティを持つ異なる種類のアルゴリズムであり、本当に異なる状況で使用されます。
Some MACアルゴリズム(確かにすべてではありませんが)は「キー付きのハッシュ関数」と考えることができますが、これは制限的なビューです。 [〜#〜] hmac [〜#〜] はよく知られているMAC構造であり、それ自体が基本的なハッシュ関数に基づいてスマートに構築されています。実際、ハッシュ関数とMACのセキュリティプロパティとモデルは互いに十分に異なるため、ハッシュ関数がセキュア(そのポイントを示す 長さ拡張攻撃 を参照)。
ある程度、安全に動作できるMACアルゴリズム-なしで [〜#〜] iv [〜#〜]は、ハッシュに似たプロパティ(それが私がHMACを好きな理由です。IVがないと、それを実装するときに誤解するのがはるかに難しくなります)。しかし、悪魔は詳細にあります。
これらは2つのまったく異なるプリミティブです。 MACはメッセージ認証に使用され、対称的にキー付けされたプリミティブです。ハッシュ関数は多くの目的に使用でき、特別なキー入力はありません。 MACは「メッセージ認証コード」の頭字語です。
一部のMACアルゴリズム(SHA1-HMACなど)がハッシュ関数をサブルーチンとして使用することで混乱しないようにしてください。彼らは非常に異なる獣です。
別のフォーラムからこれまでの答えを見つけました。
これらのタイプの暗号プリミティブは、それらが満たすセキュリティ目標によって区別できます(「メッセージに追加する」という単純なプロトコルでは)。
整合性:受信者は、メッセージが誤って変更されていないことを確信できますか?
認証:受信者はメッセージが送信者から発信されたものであると確信できますか?
否認防止:受信者がメッセージと証明を第三者に渡した場合、第三者はメッセージが送信者から発信されたものであると確信できますか? (私は法的な意味ではなく、暗号の意味での否認防止について話していることに注意してください。)また、この質問は重要です:
Keys:プリミティブには共有秘密鍵、または公開鍵と秘密鍵のペアが必要ですか?短い答えは表で説明するのが最善だと思います。
Cryptographic primitive | Hash | MAC | Digital
Security Goal | | | signature
------------------------+------+-----------+-------------
Integrity | Yes | Yes | Yes
Authentication | No | Yes | Yes
Non-repudiation | No | No | Yes
------------------------+------+-----------+-------------
Kind of keys | none | symmetric | asymmetric
| | keys | keys
使用するキーを信頼せずに認証することは役に立たないことに注意してください。デジタル署名の場合、受信者は、検証キーが実際に送信者のものであることを確信している必要があります。 MACの場合、受信者は、共有対称鍵が送信者とのみ共有されていることを確信している必要があります。