ユーザーのパスワードを、ランダムで十分な長さのソルトを使用して、キーストレッチングと安全なハッシュを使用してハッシュするとします。最終的に対称キーでハッシュを暗号化する方が安全でしょうか?
脅威モデルとは何ですか?それはcouldアプリケーション側の秘密でパスワードストレージを保護するのに役立ちますが、データベースが危険にさらされるのが現実的なシナリオであると考えられる場合にのみ、アプリケーションサーバーがなければ、秘密もまた侵害された。
通常、アプリケーション層はより脆弱な部分と見なされ、データベース層はより保護されます。このため、アプリケーション側の秘密でデータを保護することは有用とは見なされません。しかし、すべてのアプリがそうであるとは限りません。個人的には、SQLインジェクションが普及していることを考えると、この仮定に多少疑問があります。
アプリ側の秘密を導入することの欠点は、キー管理プロセスについて心配する必要があることです。キーが危険にさらされた場合にキーを置き換えるためのメカニズムは何ですか?もちろん回転させますか?サーバーを移動して失われないように、キーはどのように保存されますか(すべてのデータが役に立たなくなる可能性があります)?有効期間が短いキー(セッショントークンの署名などに使用)の場合は問題ありませんが、長期間のパスワードの保存では重要になります。
対称暗号(特にブロック暗号)のさらなる欠点は、それらを正しく実装することです。あなたはハッシュしていて、回復可能性を必要としないので、代わりにシークレットをハッシュに含めることができます(「ペッパー」として)...しかし、キーの変更時にすべてのパスワードデータを再ハッシュすることはできません。なので、ロールオーバーにはマルチキーメソッドが必要です。
ETA再コメント@Pacerier:
ハッシュは行いませんpreventパスワードデータベースを取得した誰かによるオフライン推測攻撃。それは、その攻撃が実を結ぶのにかかる時間を増加させるだけです。適切な難易度のハッシュスキーム(つまり、生のソルトの長さ自体ではなく、鍵の導出のラウンド)を使用すると、ハッキングされたことに気づき、あまりにも多くの前に全員のパスワードを変更するのに十分な時間が長くなると期待されます彼らのアカウントは失われます。
秘密鍵でコンテンツを保護すると(暗号化を使用するか、ハッシュされた素材に秘密鍵を含める)、オフラインの推測攻撃は防止されますが、秘密鍵自体が漏洩しない限りです。秘密鍵がデータベースサーバーとは別のアプリサーバーにある場合、パスワードは両方のマシンが危険にさらされている場合にのみ攻撃可能です。
特にアプリサーバーとデータベースサーバーが同じマシンである場合に、多くの種類の攻撃が両方を妥協する可能性があることを考えると、議論の余地のあるメリットはどれほどありますか。議論されているように、管理のしやすさで支払う代償もあります。したがって、純利益があるかどうかは、脅威モデルを参照してケースバイケースで判断する必要があります。
私は 多層防御 ポリシーの一部として、安全なシステムの上に保護層を追加することに大いに熱中しています。ただし、この特定のケースでは、このタスクに対称暗号化を使用すると、システムに別の問題が発生します。鍵管理に注意する必要があります。キーはどこかに保存する必要があり、アプリケーションがそれにアクセスできる場合、システムを危険にさらした攻撃者は可能性が高いキーにアクセスできます。
このような手順により、システムがさらに複雑になります。複雑さはセキュリティの敵の1つです。私はそれに対して強く助言します。
パスワードハッシュを暗号化すると、非常に特殊な状況でパスワードを保護できます。
攻撃者がデータベースへの読み取りアクセスを取得するシナリオがいくつかあります。SQLインジェクションが1つの可能性であり、リークするバックアップまたは破棄されたサーバーが別の可能性があります。この場合、彼はパスワードハッシュを総当たりにすることができます。適切なハッシュアルゴリズム(キー派生関数)を使用すると、強力なパスワードは安全で脆弱なパスワードになりますが、辞書攻撃で多かれ少なかれ高速に取得できます(最も使用されるパスワードを1000個試してください...)。
パスワードハッシュを暗号化すると、サーバーサイドシークレットがハッシュに追加されます。つまり、データベースに加えて、攻撃者は(キーを取得するために)サーバーに対する特権を必要とします。これは、コショウで得られる利点と同じですが、必要なときにいつでもキーを交換できるという利点があります。
キーが安全に保存されているかどうかはそれほど重要ではありませんが、攻撃者が必要とする追加の特権が重要です。最悪の場合、攻撃者はパスワードハッシュを取得し、暗号化なしと同じ状況になります。
セキュアなダイジェストを暗号化する場合があると思います。
今日のベストプラクティスは、bcrypt、PBKDF2、または同様のアルゴリズムを使用してソルト処理を行い、パスワードダイジェストの生成に作業係数を適用することであると一般に認められているようです。コショウの使用は、使用されているアルゴリズム/作業要素に関係なく、不十分なパスワードまたはよく知られたパスワードが簡単にブルートフォースされるのを軽減する優れた方法でもあります。
ただし、低速アルゴリズムを使用するには、ハードウェアパフォーマンスが向上するにつれて作業要素を更新する必要があり、ブルートフォース攻撃を軽減するために選択する必要がありますが、システムにログオンするユーザーのパスワード検証が過度に遅くなることはありません。パスワードハッシュの対称暗号化を使用することにより、作業負荷とペッパー要件の両方が不要になります。対称鍵が十分に保護されていて(たとえば、HSMを使用)、適切な鍵管理プロセスが確立されている場合、このアプローチにはマイナス面がありません。ブルートフォース攻撃の難しさは、パスワードの品質が良いかどうかにかかわらず、キーをブルートフォースで強制するのと同じです。
キー管理およびキーをアプリケーションサーバーから分離することに関するこれまでのすべてのコメントが適用されるため、これを行うためのインフラストラクチャを作成することはありません。しかし、インフラストラクチャがすでに整っていて十分に確立されている場合、ソルトパスワードハッシュを暗号化することには、確かにいくつかの利点があります。
私はノーだと思います。アドナンが言った理由のために、キーはアクセス可能である必要があり、したがってこのステップはおそらくシステムに複雑さを追加するだけであり、それは不必要です。
IMOのより優れたアプローチは、暗号化を余裕のあるコンピューティングと見なすことですが、使用しなかったため、そのコンピューティングを別のハッシュアプローチに使用できるかどうかを検討します。
異なる暗号化プラクティスを階層化することにより、単独の個々のプラクティスよりも安全なものになるという誤解があります。しかし、それはまれなケースです。
長いソルトを使用して適切に実装されたパスワードハッシュは、暗号的に安全です。パスワードのハッシュ化とソルト化の目的は、保存されているデータを保護することです。あなたのパスワードデータベースを手に入れる誰もがパスワードが何であるかを知っているべきではなく、たとえ別のパスワードをクラックすることに何の利点もないはずの1つ以上のパスワードをクラックできたとしても。
アドビが過去数週間に私たちに示したように、対称ブロック暗号はこのタスクには適していません。塩でハッシュすると、この問題は完全に回避されます。
ハッシュ化されたパスワードをさらに暗号化すると、キー管理の問題が発生し、保存されたデータに追加のセキュリティ/堅牢性が提供されないと指摘する人もいます。暗号化は、適切な資格情報を持つユーザーのみがデータにアクセスできるようにするのに適しています。このため、暗号化は元に戻すことができます。これは認証パラダイムではありません。
認証時には、サーバーが知っているもの(ソルト)とユーザーだけが知っているシークレット(パスワード)を使用して、同じ一意のデータのBLOBを一貫して生成するようにします。私たちは、この巨大なブロブを何度も再現できるため、ユーザーが本人であると知っています。ソルトは、2つの同一のパスワードがデータベース内で同じハッシュを持たないことを保証します。追加の暗号化は、その面でも何の助けにもなりません。