web-dev-qa-db-ja.com

HMACとキーのサイズ

長さの異なるさまざまなキーを持つ任意のファイルに対して、HMAC-MD5とHMAC-SHA256を使用してキー付きハッシュを生成しました。

HMACで固定サイズのキーを使用する必要がありますか?もしそうなら、鍵のサイズは何ですか?そうでない場合、なぜですか?

可変長のいくつかのキーを試したところ、値が取得されたので長さは関係ありませんか?

3
user9355495

HMACは非常に単純な構造です 。 HMACが標準化されていることを除いて、自分でそれを思いつくこともできます。つまり、多くの人がそれを見て、攻撃に対して耐性があることがわかりました。単純であるため、詳細に飛び込むことができます。

_hmac = hash(
    (key xor opad) +
    hash((key xor ipad) xor message)
)
_

したがって、これはハッシュ関数とxorring値を組み合わせたものにすぎず、他には何もありません。ブロック暗号は通常、固定長の鍵を必要としますが、 暗号化ハッシュ関数 "[サイズ]の任意のサイズのデータ​​を固定サイズのビット文字列(ハッシュ)にマップします"。したがって、入力するkey、パスワードは任意のサイズにすることができます。hash()関数上記のスニペットは、SHA-3やBLAKE2bなどの優れた暗号化ハッシュ関数です。[1]

もちろん、通常は長くなるほど強度が増します。 7文字のパスワードは、ランダムで記号や数字などすべてが含まれている場合でも、最新のコンピューターでは常に破られる可能性があります。しかし、その強さは、それを生成する方法のように、長さではあまりありません。「mary had a little lamb」という文字列である22文字のパスワードは、ランダムに生成された14文字のパスワードほど安全ではありません。 。したがって、パスワードをランダムに選択する方法には注意してください。ランダムなフレーズは、数十億の選択肢の1つです。ランダムに生成された7文字のパスワードにはすでに47兆の可能な値があり、それでも安全ではありませんが、人間には覚えにくいため、ユーザーパスワード(記憶された秘密)はそれよりも弱い可能性があります。

ユーザーにパスワードを要求する場合、always最初に「スローハッシュ」関数を実行します。使用する適切なアルゴリズムとパラメーターについてのアドバイスは、 パスワードを安全にハッシュする方法 のような質問を参照してください。 それを行った後でのみ、anythingのパスワードを使用する必要があります。 HMACのキーです。これはすでに強化されており、そのランダムな7文字のパスワードは、当面の間解読することは不可能です。この方法では、SHA-3のようなhash()関数の速度で攻撃を行うことはできませんが、低速ハッシュの速度で攻撃を行う必要があります。 1秒あたり100の割合で47兆のオプションを実行するには、時間がかかります!


[1] SHA-2は徐々に古くなっているため、ここでは触れません。SHA-3とBLAKE2bはそうではありませんが、長さ拡張攻撃に対して脆弱です。 HMACは長さ拡張攻撃を防ぐため、SHA-2を使用したHMACは問題ありませんが、新しいアルゴリズムを推奨します(戦闘テスト済みである限り、そうではありませんではありません )new)私が知っているよりも、少し異なる構成での攻撃に対して脆弱です。

5
Luc

RFC 2104 をご覧ください。

2. HMACの定義

HMACの定義には、Hで示す暗号化ハッシュ関数と秘密鍵Kが必要です。Hは、データのブロックに対して基本的な圧縮関数を反復することによってデータがハッシュされる暗号化ハッシュ関数であると想定します。

そのようなブロックのバイト長をBで表し(ハッシュ関数の上記のすべての例ではB = 64)、Lでハッシュ出力のバイト長を示します(MD5の場合はL = 16、SHA-1の場合はL = 20) )。 認証キーKは、ハッシュ関数のブロック長であるBまでの任意の長さにすることができます。Bバイトより長いキーを使用するアプリケーションは、最初にハッシュしますHを使用してキーを取得し、結果のLバイト文字列をHMACへの実際のキーとして使用します。いずれの場合も、Kの最小推奨長はLバイトです(ハッシュ出力長として)。キーの詳細については、セクション3を参照してください。

3.キー

HMACのキーは任意の長さにすることができます(Bバイトより長いキーは、最初にHを使用してハッシュされます)。ただし、関数のセキュリティ強度が低下するため、Lバイト未満にすることは強くお勧めしません。Lバイトより長いキーは受け入れられますが、追加の長さは関数の強度を大幅に増加させません。 (キーのランダム性が弱いと考えられる場合は、キーを長くすることをお勧めします。)

鍵はランダムに(またはランダムシードがシードされた強力な疑似ランダムジェネレーターを使用して)選択し、定期的に更新する必要があります。 (これらの攻撃は実質的に実行不可能であるため、現在の攻撃は、キー変更の特定の推奨頻度を示していません。ただし、定期的なキーの更新は、機能とキーの潜在的な脆弱性を防ぎ、公開されたキーの損傷を制限する基本的なセキュリティ対策です。 )

ページの上部には RFC 6151 へのリンクも表示されます。これも興味深いかもしれません。

2.セキュリティに関する考慮事項

MD5は、情報RFCとして1992年に公開されました。それ以来、MD5は広く研究され、新しい暗号攻撃が発見されました。メッセージダイジェストアルゴリズムは、衝突、プレイメージ、および2番目のプレイメージの耐性を提供するように設計されています。さらに、メッセージダイジェストアルゴリズムはHMACでのメッセージ認証に共有秘密値とともに使用されます。このコンテキストでは、[SP800-57]と[SP800-131]のキーの長さとアルゴリズムの強度に関するガイダンスが役立つ場合があります。

MD5は、デジタル署名などの衝突耐性が必要な場合は、もはや受け入れられません。 HMAC-MD5などの他の方法でMD5の使用を停止することは緊急ではありません。ただし、MD5はデジタル署名に使用してはならないため、新しいプロトコル設計ではHMAC-MD5を使用しないでください。HMAC-MD5の代替には、HMAC-SHA256 [HMAC] [HMAC-SHA256]および[ AES-CMAC]は、AESがハッシュ関数よりもすぐに利用できる場合です。