web-dev-qa-db-ja.com

HMAC-SHA256(key、data)とSHA256(key + data)の違いは何ですか

これらの2つのハッシュアルゴリズムの安全性に違いはありますか? HMACは、よりセキュリティを意識した特別な方法でデータとキーを「融合」しますか?

46
phillips1012

はい、HMACは単純な連結よりも複雑です。

単純な例として、単純にキー+データを連結すると、 "key1" + "data"は "key" + "1data"と同じ結果になりますが、これは最適ではありません。 HMACはそれぞれ異なる結果を生成します。多くの場合、単純な連結を伴う他の欠陥もあります。 cpastの回答を参照してください。

HMACの仕様は RFC2104 と呼ばれ、このレベルの関心がある場合は、このドキュメントを読む必要があります。

要約すると、HMACを実装するには、最初に次のことを行う必要があります。

「ipad」を作成します。これは0x36 BLOCKSIZE回繰り返されました。 「opad」を作成します。これは0x5c BLOCKSIZE回繰り返されました。

  • BLOCKSIZEは、MD5、SHA-1、SHA-224、SHA-256の場合は64バイト、SHA-384およびSHA-512の場合は RFC2104 および RFC4868 ごとに128バイトです。 =。

次に、HMACは次のように定義されます。

HASH(Key XOR opad, HASH(Key XOR ipad, text))

または、詳細にはRFCから、

(まえがき:HMACの定義には、Hで示す暗号化ハッシュ関数と秘密鍵Kが必要です。Hは、データがデータのブロックに対する基本的な圧縮関数。このようなブロックのバイト長をBと表します。

(1) append zeros to the end of K to create a B byte string
    (e.g., if K is of length 20 bytes and B=64, then K will be
     appended with 44 zero bytes 0x00)
(2) XOR (bitwise exclusive-OR) the B byte string computed in step
    (1) with ipad
(3) append the stream of data 'text' to the B byte string resulting
    from step (2)
(4) apply H to the stream generated in step (3)
(5) XOR (bitwise exclusive-OR) the B byte string computed in
    step (1) with opad
(6) append the H result from step (4) to the B byte string
    resulting from step (5)
(7) apply H to the stream generated in step (6) and output
    the result
44

実際、SHA256(key||data)には非常に大きな問題があります。SHA-256は、SHA-512、SHA-1、MD5、およびMerkle–Damgård構成を使用する他のすべてのハッシュに、 長さの拡張 攻撃:H(x)を指定すると、xの長さしかわからない場合でも、構造がどのように機能するかにより、H(x||y)を見つけるのは非常に簡単です。

(基本的に、構造は次のように機能します:アルゴリズムで指定された固定値で始まる変数stateがあります。ハッシュ関数への入力を、アルゴリズムで指定されたサイズのブロックに分割します(最後のブロックが短すぎる場合はパディングします)、および各ブロックについて、現在のブロックと現在のstateを使用して、アルゴリズムで指定された特別な関数を使用して新しいstateを計算します。最後のブロックを処理した後のstateの値はハッシュ値です。この構造を使用する関数では、xの長さがある場合、使用されるパディングpを計算できます。次に、H(x)がある場合、_x||p_のすべてのブロックを処理した後の状態になります。つまり、 H(x||p||y))を計算します。

つまり、MACキーのlengthを知っていて、SHA256(key||data)の特定の値を知っている攻撃者は、一部のSHA256(key||data||otherdata)を簡単に計算できます。 otherdataが指定されています。他のほとんどのデータを選択できますが、選択できなくても、キーのない攻撃者がanyMAC-dataペアを偽造できる場合、これはMACスキームの致命的な欠陥です他の正当なMACデータペアから。

ちなみに、SHA256(data||key)は、長さの拡張に対して脆弱ではありませんが、_SHA256_の衝突に対して脆弱です。これは、同じ反復構造のため、提案されたMACでも衝突を発生させる可能性があります。 HMACのネストは、これらの攻撃や他のさまざまな攻撃を防ぎます。ただし、Merkle-Damgård以外のハッシュでは、必ずしもHMACの構築は必要ありません。

25
cpast