Context:Webサイトは複数の専用サーバーでホストされています。フロントエンドWebサーバー、バックエンドDBサーバー、およびそれらの間に他のサーバーがあります。 DBはユーザーのアカウントのパスワードを保持します。すべての接続は安全であり、登録/ログインページをブルートフォースすることはできません(質問の範囲外)。
脅威のモデル:ハッカーがDBのコピーを取得し、パスワードを解読しようとしています。ハッカーは非常に強力なハードウェア能力(CPU/GPU/RAM/ASIC)を備えており、勝者と見なされる1つのパスワードをクラックするだけで済みます(最大数のユーザーを保護するだけでは不十分で、すべてのユーザーを保護する必要があります)。
質問:以下のケースのうち、ハッカーの取り組みに対して最も安全であると考えられるのはどれですか?
私の意見では、イテレーションは「123456」などの貧弱な(低エントロピー)パスワードをせいぜい数時間/日以上保護しないため、ケース2の方がはるかに耐性があります。秘密が非常に長く、そのうちの少なくとも1つが不明なままである限り、エントロピーの増加は何十年もの間すべての人を保護すると思います。
私はそのような計画が生産に頻繁に展開されることをあまり見ませんが、一般的にコンセンサスは「反復+塩または恥ずかしい」であるため、何かが足りない可能性があります。
もちろん、実装は安全である必要があり(ハンドメイドvsより標準的なscrypt)、秘密は不明のままでなければなりません。さらに、シークレットが明らかになり、変更する必要がある場合、更新プロセスは面倒です。一方、ログインプロセスはハードウェアフレンドリーです(反復処理なし)。
編集(マシューズのコメントに基づく):私の質問は、反復ベースの方法でのコショウの利点についてではありません。これは、反復ベースの方法とシークレットベースの方法のセキュリティの違いです。
編集2:私はより多くの検索を実行し、結局同様の質問を見つけましたが、結局、私の悪い(結果は現在の質問に対する私の活動に基づいて改善されたかもしれません) )。 いい答え(Thomas Porninによる) がここに似ています。
システムが完全に危険にさらされていると想定します。攻撃者は、すべてのピーマン、必要なすべての塩、およびそれらをどのように組み合わせるかについての知識を持っています。これは、暗号化されたパスワードのテーブルを取得する攻撃者にとって同等の状況です。
この時点で、あなたのスキームでは、パスワードの解読は高速です。 SHA-512は、毎秒数百万のハッシュで計算できます。現在の一般的なアドバイスでは、bcrypt、パスワードの解読はまだ遅いです。それを調整することにより、標準的なハードウェアを毎秒数百に制限することができ、専門のハードウェアはまだ毎秒10,000しか与えられません。
さて、あなたがコショウのデータを盗むことが絶対にできないと確信できれば、それは問題ありません。ただし、パスワードを紛失した場合、パスワードはほぼ瞬時に脆弱になります。高速ハッシュにより、攻撃者は一般的なパスワードを簡単に試すことができます。一方、反復にはその問題はありません。
反復は実装も簡単で、1つは通常組み込みの機能です。これは開発者にとってはほとんど手間がかからないため、正しく実装するのが簡単になります。一方、このスキームでは、異なるサーバー上の複数の場所にコードをハッシュする必要があります。中間ハッシュがどの時点でも公開されていないことを確認する必要があります。各レイヤーのコードが正しいことを確認する必要があります。一部のシステムでは追加のソフトウェアを実行する必要がある場合があります(DBMSはネイティブでハッシュ方式をサポートしていますか?)。可動部分はたくさんあります。どこかで間違いを犯す方がずっと簡単です。
つまり、イテレーションは完全な妥協の場合でもセキュリティを保持し、開発が容易になります。理想的な世界では、マルチレイヤーペッパーは、データベースが危険にさらされており、他のシステムが危険にさらされていない障害モードを防ぐことができます。遅い(高い反復)ハッシュを使用することに加えて、セキュリティ要件の高いシステムに追加するのに適していますが、ペッパーが決して侵害されないという完全な確信がない限り、そうではありません。