web-dev-qa-db-ja.com

クライアントでJavaScriptを使用して機密フォームデータを暗号化する必要がありますか?

これはHTTPSに代わるものではありません。そのため、この質問をするのはそのためだと思い込まないでください。私は探検しています、そして私は好奇心が強いです。私はこれについて専門家の意見を探していますが、どこに質問すればよいか完全にはわかりません。

さて、私は本当に機密情報(たとえば銀行情報)を送信しているとしましょう。そして、私はそれを保護するためにさらに一歩踏み出したいと思います。

JavaScriptを使用すると、送信時にフォームデータを暗号化します。次に、サーバー(バックエンド)で復号化します。

  • 最初のオプションは、非対称暗号化のみを使用することです。公開時に、送信時にフォームデータを暗号化します。また、公開されているため、クライアントがそれを知ることは害になりません。次に、サーバーで、秘密鍵を使用してデータを復号化します。これは明らかにプライベートであり、サーバーだけがそれを知っています。

  • 多くの非対称アルゴリズムは本当に遅い私が聞いたものからであり、暗号化できる量(RSAなど)の点でかなり制限される可能性があります。では、ハイブリッド暗号化はどうでしょうか?対称暗号化(毎回ランダムな鍵が生成される)を使用してフォームデータを暗号化し、次に対称鍵を非対称非対称公開鍵を使用して暗号化します。データとともに対称鍵を送信します。秘密鍵で鍵を復号化し、鍵を使用してデータを復号化します。

どう思いますか?私はどちらが良いかについて少し迷っています。そして、これについてどうするか。

5
user10103279

ここでの最良のシナリオは、時間を浪費していることです。一般に、WebアプリケーションでHTTPSに加えてクライアント側の暗号化を行うことは多くの作業ですが、追加のセキュリティは提供されません。

追加の暗号層の目的は、TLS暗号化をクラックすることになんとかして管理したMITMから保護することです。しかし、それを行った攻撃者は、追加の暗号のJSソースを簡単に変更し、単にオフにすることができます。したがって、これはTLSをクラックしたパッシブMITMに対してのみ有用であり、それは実際には、保護するために多くのエネルギーを投資する価値のある脅威モデルではありません。

また、安全な乱数を生成する多くのブラウザー(Opera Mini、IE9)の機能には制限があるため、クライアント側の暗号化は注意が必要です。暗号に関連するものについては、Math.randomに依存しないでください。

あなたはそれが最大の影響を与えるところにあなたのエネルギーを集中するべきです。独自の暗号を実装する代わりに、HTTPSで無料で入手できる適切な暗号を正しく使用していることを確認してください。 MITM攻撃を心配している場合は、HSTSを調べてプリロードする方がはるかに時間がかかります。

8
Anders

おそらくそうではないが...

@Anders応答で説明されている情報のほとんどは正しいものであり、正しい応答として認識されるはずです。

実行中のクライアント/サーバーセッション専用に暗号化を実行していると想定している場合は、HTTPSを使用するだけの追加の利点はありません。

ただし、HTTPSに代わるものを探しているわけではないと説明したので、以下のシナリオのいずれかを検討していると想定します。

  1. 多層サーバーアーキテクチャを作成し、高度なアクセス許可を持つサーバーのみが機密データを読み取れるようにします。

  2. 一部のデータベースに保存されているデータを格納できるようにしたいが、someのサーバーのみがデータを読み取れるようにしたい。

  3. 実際には、クライアント側の暗号化が必要です。サーバーはそれを読み取ることはできませんが、保存することができます。


警告エンプター

これら3つのシナリオはすべて、サーバーコードをある程度信頼できるという前提に基づいています。 (これは、コードレビューが多い構造化組織で機能する可能性があります)。


従来の方法

オプション1は、CORSを有効にし、クライアントが「高度な」サーバーと通信できるようにすることで、伝統的に実装できました。ただし、これには「高度な」サーバーをインターネットに開く必要があります。

これには通常トークン化が含まれ、多くの支払い処理業者が使用するアプローチです。

オプション2は、データをデータベースに挿入する前に対称的に暗号化することにより、サーバー側で実装できます。


非伝統的な方法(教育のため)

オプション1と2のユニークな組み合わせがあるか、サーバーを開いてWebを開かずにオプション1を探索したいとします。

はい、ハイブリッド暗号化システム(非対称+対称)を使用して、特定のサーバーだけが解読できるデータを効果的に暗号化できます。 このような暗号システムを実装することは困難であり、正しく実行するには広範な暗号知識が必要です。

オプション3の場合、クライアント側で対称的に暗号化/復号化して、ユーザーデータを保護できます。これはおそらく、(便宜上)変数をlocalStorageに格納する必要があり、リスクを伴います(それをこするコードを非表示にする方が簡単です)。

これらのアプローチcouldは、構造化された組織の従業員がユーザーデータを盗むことをより困難にするのに役立ちます。 ただし、データ暗号化メカニズムを改ざんできないか、資格情報を盗用できない場合にのみ機能します。

暗号化は、想像できるどんなシナリオでも特効薬にはなりません。かなりの数の攻撃ベクトルを軽減できますが、すべてを解決するわけではありません。あなたは徹底的なコードレビューを必要とするでしょう。