3

JavaScript Web Crypto APIを使用してクライアント側の暗号化を Web アプリケーションに追加したいとします。私のアプリケーションのクライアント側は、暗号化されたデータをサーバーに送信する前にキーを使用して各ユーザーのデータを暗号化し、サーバーから返されたデータを復号化して表示します。

ユーザーは、このようなアプリケーションの鍵を、使いにくくすることなく、どのように保管するのでしょうか?

キーをブラウザに保存する簡単な方法はありますか?

または、各ユーザーは自分のコンピューターのローカル ファイルにキーを保持し、ログインするたびにそれを Web アプリにインポートする必要がありますか? Apple Keychain のような別のパスワード マネージャーを使用できますか?

4

1 に答える 1

3

Web Cryptography Api のブレークスルーは、秘密鍵の内容を公開することなく、暗号化鍵の作成、使用、保存をネイティブにサポートすることです。

要約すれば:

  1. WebCrypto を使用してキーを生成し、エクスポート不可としてマークします
  2. キーを IndexedDB に保存する

暗号化キーを使用できますが、その内容はユーザーとプログラマの両方に対して隠されます。画像では、「cryptoKey」オブジェクトがブラウザによって隠されていることに注意してください

暗号化キーが隠されているインデックス付き DB

なぜ使わない...

  • Cookie / ローカル ストレージ: テキスト ストレージのみを許可します。キーは base64 としてテキスト形式にエクスポートする必要があり、その内容は悪意のあるエージェントやユーザーによってコピーされる可能性があります...
  • Local File : ユーザーフレンドリーではありません。キーの保護は完全にユーザーの手に委ねられています。各アプリケーションでは、ユーザーはキーを WebCrypto にインポートする必要があります。このソリューションは、同一生成元ポリシーによって保護されていません。ユーザーは他のサイトでキーを使用できます。

代替案(@dandavis によるコメント)

  • キーを保存しないAES などの対称暗号化アルゴリズムで使用するパスワードからキーを取得します。必要に応じてキーが生成され、ユーザーにパスワードが要求されます。利点 パスワード マネージャーを使用することは可能ですが、その場合、ブラウザーにパスワード文字列が保存されます。キーは複数のコンピューターから使用できます

これらのソリューションは、データをサーバーから隠す必要がある場合に適しています。サーバーが必要なクライアント データを処理できるようにするには (キーの種類によって異なります)

  • 対称鍵:データを復号化するために、サーバーに鍵自体 (抽出可能でなければならない) またはパスワードを提供する必要があります。

  • 非対称鍵:サーバーは鍵ペア (公開/秘密) を使用します。サーバーは公開鍵をクライアントに送信します。クライアントからサーバーに送信されるデータは、サーバーの公開鍵で暗号化され、秘密鍵で復号化されます。サーバーからクライアントに送信されるデータは、クライアントの公開鍵で暗号化され、クライアントの秘密鍵で復号化されます。

于 2016-07-17T20:32:58.473 に答える