web-dev-qa-db-ja.com

シンプルで安全なクライアント側の暗号化を実装する方法

こういう質問が出てくるのはわかっていますが、簡単な答えは見つかりませんでした。ほとんどの答えは「それをしないでください」です。

プレイのために、私は自分でWebアプリケーションを構築しました。それはsjclを使用して、クライアント上のノートを暗号化および復号化し、暗号化されたフォームをサーバーに送り返します。

ローカルストレージにキーを保存しています。

私の研究から、私は以下のリスクにさらされています:

  1. クロスサイトスクリプティング攻撃(私のアプリケーションはAJAXを使用してサーバーとのデータの送受信を行っています。これが攻撃経路かどうかはわかりません)。
  2. ハッキングされるローカルマシン。現時点では、アプリを完全に制御できるマシンでのみ使用できます。制御していないマシンからログインしてキーを入力すると、そのマシンには基本的にキーがあります。
  3. 別のドメインのサイトがブラウザに保存されている他のウェブサイトのストレージを読み取ることができる、ローカルストレージのあらゆる種類の欠陥。

私は無数の他の攻撃ベクトルを見逃したと確信しています。

一見すると、サーバーにキーを送信しないクライアント側の暗号化されたメモ作成アプリケーションを設計することは不可能だと感じています。プログラミングには、ほとんど常に方法があります。

アプリを実際に使用できるようにする方法はありますか?

6
Joseph

基本的に、キーが安全であれば、データも安全です(ただし、暗号化アルゴリズムが適切で、キーが十分に長い場合、私はそれを当然と見なします)。

私が正しく理解していれば、暗号化されたデータのみを送信し、キー自体は送信しません。そうでない場合は、この回答全体を破棄してください。

キーがネットワーク経由で送信されることはないと仮定します。データを危険にさらす唯一の方法は、キーを発見することです。これは次の場合に発生する可能性があります。

  • キーの生成方法は予測可能です
  • ファイルにアクセスできる人
  • PC上のウイルス
  • DNSスプーフィング攻撃(ホスト/ドメインであると主張)-> TLSと証明書を使用( http://dev.w3.org/html5/webstorage/#privacy を参照)
  • いくつかのエキゾチックなブラウザー/バージョンのバグを悪用する(これが既に発生している場合、およびいくつかの脆弱性アラートなどがある場合は、dunno)
  • ...他に何かありますか?

...完全なセキュリティを実現するのは困難です。しかし、あなたの場合、攻撃者はそれをハッキングするためにかなりの時間を費やさなければならないようです、またはユーザーは最初からマシンが危険にさらされています。通常、ボトルネックはユーザー自身です。 ;)

4
dagnelies

基本的な用語では、クライアント側でデータを暗号化(トークンを作成)し、HTTP経由でサーバーにトークンを送信すると、安全になります-これは真実ではありません

ハッカーは ネットワーク監視ソフトウェア (パスワードは不要)-でトークンを取得できます以上です。これをバイパスするための推定時間は15分未満です。

1
Margus

まず、私が理解していることから、他のユーザーからのデータをユーザーに表示しないので、XSSについて心配する必要はありません。表示する場合は、文字のエスケープなどの対策を講じる必要があります(実際にはとにかく使用する必要があります)。ハッキングされたマシンとブラウザのセキュリティ上の欠陥は、予測できないものです。

次に、作成した暗号化機能は実際には機能しません。ごめんなさい。セキュリティに関する長年の経験を持つ天才でなくても、この質問をする必要はありません。暗号化を設計する際に考慮すべき事項は次のとおりです。

  • Man in the Middle-誰かが自分のマシンのサーバーからデータを復号化してユーザーのデータをキャッチし、クライアントに送信するときにそれらを再暗号化できますか?攻撃者は実際のサーバーにトークンを要求するだけでよく、クライアントになりすましてサーバーであるように見せかけると、独自のキー/トークンのセットを生成することができます。
  • ネットワーク監視-たとえば、攻撃をリプレイする可能性がないと確信していますか?いくつかのショップでいくつかの商品を注文するとします。攻撃者がそれを記録してサーバーに再生すると、同じ暗号化されたデータがサーバーによって検出されるか、トランザクションを再度コミットしますか?
  • 鍵の生成-使用する鍵は完全にランダムですか、それとも予測可能なだけランダムですか?攻撃者がサーバーに保存するのと同じキーのセットを生成できる場合、攻撃者は直接攻撃する必要すらありません。ただ腰を下ろすことができ、他の影響はかなり明白です。そして私を信じて、時間シードを持つ標準ランダムは非常に予測可能です。
  • たくさんそしてもっと...

SSLのようなライブラリがあり、長年の経験を持つ人々によって作成されています。おそらくご存じのように、間違いが発生したとしても、なんらかの理由で代替手段を実装することに特に熱心な人はいないようです。

セキュリティの場合、おそらく最も安全なソリューションであるため、チェック済みの一般的なソリューションを使用することをお勧めします。利用可能なオープンソースとフリーのライブラリがかなりあるので、それは問題にはならないはずです。ブラウザでサポートされているレディ暗号化は、おそらく想像する以上に多くの問題を処理します。

もちろん、私があなたを誤解していない限り、あなたはそれのwebappの部分のためにではなく、セキュリティのためにwebappsで遊んでいませんでした。その後、挑戦を続け、作成したアプリを攻撃することで多くのことを学ぶことも覚えておいてください。

1
Wikiii122