web-dev-qa-db-ja.com

pkdf2とscryptを組み合わせるのはどうですか?

可能性のある複製:
BcryptとPBKDF2を一緒に使用することは理にかなっていますか?

次のパスワードハッシュ方式はどのように見えますか?

iterations1 = scrypt iterations required to spend 50ms on my hardware
iterations2 = pbkdf2 iterations required to spend 50ms on my hardware
ram1 = scrypt suggested default ram requirement
salt1 = urandom
salt2 = urandom
hash = scrypt(pbkdf2(password, salt2+pepper, iterations2), iterations1, ram1, salt1+pepper)
save(username, hash, salt1, salt2, iterations1, iterations2, ram1)

このソリューションは、この記事を読んだことで促進されました: http://www.unlimitednovelty.com/2012/03/dont-use-bcrypt.html

これは、私がscryptの優れた機能を利用できるようにするだけでなく、pbkdf2のテスト済みのセキュリティを利用できるようにするためです。それは合理的なアプローチですか?これを2つのアルゴリズムの1つだけを使用するように制限する必要があると思いますか、それとも両方のアルゴリズムに1つの共有ソルトのみを使用するべきだと思いますか?

5
Bryan Field

組み合わせると、利点が薄れます。この低速ハッシュビジネスは、攻撃者と同等の理由で攻撃者と戦うこと、つまりCPUを攻撃者と戦うことです。 scryptは、攻撃者がPC以外のハードウェアを使用して物事を最適化するのではなく、使用するハードウェア(PC)の種類に合わせてパスワードハッシュを最適化することにより、物事をさらに均等化します。攻撃者がGPUでPBKDF2を完全に最適化できるため、CPU予算の半分をPBKDF2に費やした場合、よりも半分は少し無駄になります。

主題の詳細な分析については この答え を参照してください。

あなたが引用した記事は疑わしい品質のようです。たとえば、3DESの弱点の申し立てに基づいてbcryptを悪用します-しかし、bcryptは3DESについてまったくではなく、既知の攻撃はありませんアカデミックコストは3DESでも「80ビット」です。その記事をあまり信用しないことをお勧めします。

3
Thomas Pornin

Pkdf2でscyrptを使用することに意味がありません。 scryptを使用すると、特定のハッシュを生成するために必要なCPUとメモリの量を定義できます。これを行うために、scryptはハッシュ関数を循環してこの出力を生成するという点で、pbkdf2によく似た動作をします。

pkdf2 + bcryptは優れたパスワード保存方法ですが、メモリ使用量を増やすこともできるので、これよりもscryptの方が良いと思います。

1
rook

これは、あなたが考えるほどのメリットはありません。内部ハッシュを異常に変化させるような方法でデータを操作できるため、内部ハッシュに対するあらゆる種類の攻撃に対して脆弱であり、内部ハッシュが大幅に低下します。より良い解決策は、2つのハッシュの出力をXORすることです。

h1 = M_a(m, salt1, params_a)
h2 = M_b(m, salt2, params_b)
hash = h1 ^ h2
save(username, hash, salt1, salt2, params_a, params_b)

これにより、前述の欠点がない、少なくとも最強のハッシュのセキュリティが確保されます。これは、まったく異なる構造のハッシュにのみ当てはまり、セキュリティの「証明」が不適切に定義されている(またはその欠如)ことに注意してください。

どちらの方法でも、guaranteeが期待どおりに相互作用することはないため、関数を組み合わせるのはおそらくnot good ideaです。暗号化機能は主にカードの家であり、トーマスポルニンが雄弁に言ったように、$DEITY。それらを混合すると、未知数が表示されます。欠陥がある、または強いとは言いがたいですが、一般的には、最高のものを期待している場合です。

ただし、これはすべて、前提が有効であることを前提としています。 PBKDF2とbcryptを組み合わせたものと同じ強度を備え、GPUおよびFPGAアクセラレーションを非常に非効率的かつ困難にするように設計された追加機能を備えたscryptを使用する方がよいでしょう。

1
Polynomial

さて、まず第一に、あなたはpbkdf2への引数を欠いています-つまり、出力の長さです。これは、文字通り、pbkdf2アルゴリズムを通過した後、入力関数のnブロックに切り捨てることによって制御されます。

これを取り上げた理由は、このように2つの関数を組み合わせると元に戻す可能性があるためです。仮に、仮に、pbkdf2から1バイトの出力を生成することにしたとします。これで、scryptに2 ^ 8の入力が可能になりました。高価な要件があっても、256の可能な入力は総当たりするのは難しくありません。次に、特定のパスワードハッシュからpost-pbkdf2状態に戻ることができます。

Pbkdf2からの出力の1バイトを要求すると、hmacが切り捨てられるという興味深い可能性があります。2^ 160(pkcs#5とhmac-sha1の場合)ではなく2 ^ 8を超える衝突を見つける必要はありません。英語では、theパスワードを見つける必要はありません。機能するaパスワードを見つける必要があります。

もちろん、この特定の例は、pbkdf2から非常に小さな出力を生成することを決定した場合にのみ発生しますが、これは、使用するプリミティブが十分に吟味されている一方で、それらを使用して行っていることが悪い場合がある例です。ハッシュの切り捨ての詳細については、「 暗号化ハッシュを切り捨てることで解読できなくなるのですか? 」を参照してください。

個人的には、pbkdf2またはscryptのいずれかを使用し、両方は使用しません。

1
user2213

PBKDF2とbcryptについて:bcryptは専用ハードウェア経由での攻撃が難しいため、非常に強力です。 bcryptに問題がある可能性はありますが、それは よく知られている関数 に基づいており、13年間問題が発生していないようです。

PBKDF2は、より厳密な標準ですが、専用ハードウェアを介した攻撃もはるかに容易であるため、そのセキュリティが既知である bcryptが(まだ)壊れていない方法で。

同様に、bcryptはscryptよりも専用ハードウェアを介した攻撃がはるかに簡単です。違いは、scryptが3年前に提示されたのに対し、bcryptは13であったことです。

また、scryptは どうやらIETF標準と見なされている なので、うまくいけばすぐにもっと精査されるでしょう。

2つの関数をチェーンする必要があるかどうかについては、 thesequestions が私よりもよく答えます(2番目はbcrypt + PBKDF2についてですが、問題の関数は関係ありません)あります:)

だからあなたはそのように強いものを得ることはありません。代わりに、Bcryptのみ、またはPBKDF2のみを使用した場合と同じセキュリティレベルが得られます。

2つのハッシュ関数または類似の関数を組み合わせることは、破壊されたことが判明した場合に壊滅的な障害を回避するのに適しています。ただし、BcryptとPBKDF2の両方が強力で、問題はほとんどパフォーマンスに関するものであると想定します(bcryptとPBKDF2の両方は、徹底的な検索を遅くすることなので、すべてパフォーマンスに関するものです)最適な速度を得るために、bcryptとPBKDF2を組み合わせることはお勧めできません。

「致命的な障害」が発生する可能性はほとんどないことに注意してください。つまり、MD5は壊れている既知ですが、MD5を使用するPBKDF2はまだ「十分」です。確かに速すぎますが、反復を増やすことができます。確かに衝突耐性は得意ではありませんが、妥当な長さ(100文字未満)のパスワードでは問題になることはまずありません。

0
Brendan Long