パスワードの保存にSCRYPTの使用を検討しています。 (私はPBKDF2、またはbcrypt自体にもオープンです)。
問題は、実際の計算のオーバーヘッドを考えると、これがDDOS攻撃の潜在的なポイントにならないようにすることです。
私は何かを考えていました[〜#〜] very [〜#〜] SALT + PASSPHRASEに対する最初のサニティチェック(CRC8のような)が良い考えかもしれないので、多くの衝突で弱いです。 (次に、タイミング攻撃を防ぐために失敗を返す前に待機を使用します)。
これは、最小長が8であることを前提としており、次の要件は3 of4です。
データが危険にさらされた場合、ブルートフォース攻撃でのSCRYPTの有効性が実際にどの程度低下するでしょうか。
このようなアルゴリズムを台無しにしないでください。この方法の影響については考えられませんが、不安を募らせています。 CRCは比較的単純な数学関数であり、もちろんデータベース部分ではより高速であるため、少なくとも、攻撃者は約256倍の速度で移動できます。あなたは、誰かがDBアクセスを取得した場合に、すべてのパスワードをダンプすることから離れた、いくつかのホワイトボードコーディングの演習です。
代わりに、クライアントアドレスまたはクライアントアドレスプレフィックスごとにレート制限されている安価な関数を使用してトークンを発行し、そのトークンにユーザー名とパスワードを要求します。これにより、高価なパスワードチェックプロセスを実行する頻度をレート制限できます。
私はジェフの答えに賛成した。アーキテクチャ的には、クライアントアドレスに関連付けられ、クライアント側のログイン入力画面が呼び出されたときに実行される、いくつかの独立したゲート保持関数を作成することをお勧めします。これを認証ルーチンとは別にしてください。何らかの方法でアカウントにフラグを立てる前に、試行率または最大試行回数を制限できます。これにより、認証のコアをいじくり回す必要がなくなります。
暗号化の実装は最も弱いリンクの機能であり、CRCは実際には真の暗号化ハッシュプリミティブでさえありません。この点でかなり悪いです。 CRCチェックサムを保存すると、データベースを取得した攻撃者が簡単に並列化できるプロセスを利用して、データベース内の各パスワードを攻撃する作業を減らすことができるため、問題が発生します。最後のscryptハッシュを使用してsalt + passフレーズのCRCをそこに配置すると、攻撃者は一種のふるいとして機能します。攻撃者は、他のオブジェクトなしでブルートフォース攻撃を開始する高速ルーチンを実行して、保存されているCRCにチェックサムする文字列を見つけることができます。このふるいステップを通過する文字列のみが、計算とメモリを大量に消費するscryptハッシュを介してガントレットを実行する必要があります。攻撃者が辞書を実行している場合はさらに高速になります。