私のアプリケーションがユーザーデータのクライアント側を暗号化し、そのデータをサーバーに送信できるようにするスキームを絞り込みました。サーバーがデータを復号化する可能性はありません。
このスキームに明らかな欠陥がないことを確認したいと思います。
メソッド
注:以下のすべての手順はクライアント側で行われます。
前駆:
gk = SHA256(user_password)
を生成し、gkを格納します 暗号化:
復号化:
ユーザーがパスワードを変更した場合:
ユーザーがパスワードを忘れた場合:
この手順にはどのような欠陥がありますか?
更新
1つの欠点は、ユーザーがパスワードでログインを認証した場合、技術的にはgkを簡単に計算してサーバーに保存できるため、クライアント側の暗号化。
これに対する解決策:
pw = SHA256(SHA256(user_password))
を生成し、これをユーザーのパスワードとしてサーバーに送信します。サーバーはこのパスワードを受信し、保存する前に再度暗号化します。つまり、サーバーに関する限り、サーバーは通常のパスワードを受け取っているだけです。しかし、この方法では、gk
をサーバー側で計算することはできません。
欠陥?
このスキームの最大の欠点は、(a)サーバーによってクライアントに送信されるJavaScriptコードに依存することです。
では、すべてのセキュリティ対策を回避するクライアントの変更されたJavaScriptを送信するために、サーバー(またはその中間)を維持するために何をすべきでしょうか。クライアント、さらに言えば、ユーザーはこれまでにどのように知っていますか?指紋、チェックサム、デジタル署名などをチェックするために作成するすべてのコードも同様に回避できます。
関連する問題は、ブラウザで実行されている、セキュリティ関連のJavaScriptコードから確実に分離できない他の悪意のあるJavaScriptコードです。
これを修正することは不可能です。ブラウザー内のJavascriptは現在安全なプラットフォームではなく、すべてのブラウザーのクライアント側の暗号化は、閉じることができないこのギャップのあるセキュリティホールに悩まされています。
Pw = sha256(sha256(user_password))を計算することは、いくつかの理由で私を悪い考えと思います。
あなたは、例えば、代替案を提案しますgk = sha256(user_password)およびpw = sha128(user_password)。これはポイント2を解決しますが、1と3には対応していません。また、攻撃者に追加の情報(2つの異なるハッシュ値にハッシュされた同じパスワード)を不必要に提供すると想像できるので、私はそれをお勧めしません。それを悪用する方法がわかりません。
Gk = hmac(user_password、n)とpw = hmac(user_password、m)を使用することをお勧めします。mとnは既知ですが、ユーザーごとに異なります。 mとnに到達する方法は、それらがランダムで十分に大きく、ユーザーベース全体でそれらを高い確率で一意にする限り、関係ありません。それらをクライアントで作成し、サーバーに保存するために送信し、ユーザー名でインデックスを付けて、他のクライアントで取得できるようにすることができます。または、ユーザーが最初にアカウントを作成するときにサーバーにそれらを生成させることができます。値を安全に保つ必要はありません。 user_passwordがなければ、価値がありません。改善点は、gk = hmac(bcrypt(user_password)、n)およびpw = hmac(bcrypt(user_password)、m)を使用してブルートフォース攻撃を困難にすることです。
さて、hmacは認証トークンや暗号化キーを作成するためではなくメッセージ認証用に設計されているので、この提案が良い考えであるとは確信していません。しかし、これは私が提起した3つのポイントすべてを解決するようです。そのため、同じハッシュ関数をチェーンするか、パスワードに2つの異なるハッシュ関数を使用するよりも、優れたソリューションのようです。
gk
はCookieではなくlocalStorage/IndexedDBに保存する必要があります。fk'
他のユーザーのファイル。プレーンテキストのパスワードを送信する以外の方法でユーザーを認証する必要があります。キー導出関数を介して入力されたgk
値を2回送信することもできます。gk
値をサーバーに送信するか、そうでなければそれらをリークすることで、ユーザーデータを取得できます。これは、オープンにレビューされたコードを持つService Workerを上手に使用することで軽減できますが、だれかがまだ十分にそれを行っているかどうかはわかりません。