web-dev-qa-db-ja.com

鍵導出関数を安全に使用して個人データを保護する方法-ガイダンスが必要

クライアントアプリで作成した安全なデータがあり、ユーザーのバックアップとしてサーバーに保存したいと考えています。

ユーザーは、サーバーで認証するためのパスワードをすでに持っています。パスワードがサーバーに送信されることはありません(私はSRP6を使用してユーザーを認証します)。

だからここに私の考えがあります...

  1. Fortuna PRNGを複数のイベント入力(マウス、キーボードなど)で使用して、ソルトを生成します。
  2. ScryptまたはPBKDF2 + SHA512への入力としてソルトとパスワードを40,000回以上繰り返して使用し、512ビットのキーを生成します。
  3. キーの最初の256ビットを使用して、ランダムIVでAES-256-CBCを使用してプライベートデータを暗号化します。
  4. 暗号文とソルトをサーバーに送信します。
  5. KDFの反復回数を、覚えておく必要のある数としてユーザーに示します。後でクライアント側でデータを復号化する必要があるときに、それを要求します。

だから私の質問は...これは十分に安全ですか?最初はサーバー側にも反復回数を保存するつもりでしたが、サーバーにアクセスした攻撃者は簡単にキーをブルートフォース攻撃できる可能性があると感じました。繰り返しになりますが、ユーザーがパスワードと番号を覚えられるかどうかは別の問題です。

1
hiddentao

「これで十分安全ですか?」これは、誰に対して防御しているかによって異なります。

理論的には、TLA以外の攻撃者にもかなり耐えられるように見えますが、暗号化IVをどこにも保存していないように見えるため、復号化には少し注意が必要です。

実際には、大きなセキュリティホールがあります。実際のユーザーは、KDFの反復回数を記憶しません。それはどこかに書き留められます、そしてユーザーがそれを書き留めているので、彼らはおそらくそれのすぐ隣に彼らのユーザー名とパスワードを置くでしょう。

1
Mark