web-dev-qa-db-ja.com

ナイーブキーストレッチvs PBKDF2

以下のような簡単なキーストレッチアプローチを使用することの欠点は何ですかPython例、PBKDF2のようなものと比較して?目的は、ブルートフォースに対してAES暗号化ファイルを強化することです。

簡単な方法で重大な問題はありますか?プログラミングに使用している言語で利用できるPBKDF2実装はありません。

for _ in range (100000):
  key = hashlib.sha256(key).hexdigest()
3
John Blatz

PBKDF2のセキュリティ引数は、提案よりも優れています。これは、提案が安全性が低いことを意味するのではなく、PBKDF2の方が正当化しやすいということです。

これは、PBKDF2が反復提案だけでなく、3つの追加のアイデアを組み込んでいるためです。まず、PBKDF2には明示的にソルトが組み込まれていますが、例には組み込まれていません。暗黙的にkeysalt + password、パスワードスクランブラは、実際にはパスワードとソルトを別々の引数として受け取る必要があります。

次に、PBKDF2はSHA-256のような公開ハッシュ関数ではなく、HMACのような 擬似ランダム関数 ( "PRF")を反復します。 -SHA-256、パスワード付き。これは非常に微妙な理論上のポイントですが、これは、PBKDFがSHA-256のような本格的なハッシュ関数よりも弱い関数を処理できることを意味します。

第3に、PBKDF2はPRFの出力をチェーンするだけでなく、その出力をXORします。これは、独自の出力に適用されたときに短いサイクルを持つ弱いPRFに対する(おそらく偏執狂的)保護手段です。

PBKDF2は実際にはかなり単純です。 素人はそれを台無しにする可能性が低いほど十分に単純です。言語とライブラリにSHA-256が含まれている場合は、HMAC-SHA-256も含まれている可能性がありますが、そうでない場合も簡単に実装できます。ですから、実際に試してみるべきです。自分で料理するよりも、十分にテストされた標準的な手法を使用する方が良いです。


最後の注記:ハッシュ関数の出力はbinary dataであり、実際にはそのように扱う必要があります。つまり、例でのhexdigestの使用は無駄であり、高品質のコードにはつながりません。データは可能な限りネイティブタイプで処理する必要があります。 (16進数のダイジェストを使用すると、PBKDF2の実装が正しくなくなります。)

2
Luis Casillas

wikipedia:Key Stretching から:

...は、弱いキーとなる可能性のあるキーを作成するために使用されます...可能性のある各キーをテストするのにかかる時間を増やすことにより、ブルートフォース攻撃に対してより安全です

SHA-2のようなハッシュは、ハッシュだけを使用して単純なキーストレッチを高速化するように設計されているため、弱い入力に基づいてキーをブルートフォースで攻撃しようとする攻撃者を実際に遅くすることはありません。代わりに、PBKDF2のようなKDFは、攻撃者自身を遅くすることによって攻撃者を本当に遅くするように設計されています。

この例では、計算を遅くするために多くの反復を行っていますが、攻撃者はすべての興味深い弱い入力とその出力のデータベースを一度作成し、攻撃時にすべての値を再計算するのではなく、後で複数の総当たり攻撃でこの事前計算された値を使用する可能性があります。そのため、PBKDF2のようなアルゴリズムはさらに salt を使用して、このようなデータベースに必要なメモリと、データベースを作成する時間を大幅に増やし、非実用的にします。

プログラミングに使用している言語で利用できるPBKDF2実装はありません。

言語がすでにハッシュを計算する方法を提供していて、とにかくいくつかのKDFを作成する用意がある場合は、独自のアイデアの代わりにPBKDF2または他の適切に設計されたKDFを実装することはそれほど難しくありません。

4
Steffen Ullrich