ローカルストレージを安全と見なすことはできますか?[閉まっている]


160

オフラインで長期間機能するWebアプリケーションを開発する必要があります。これを実行可能にするために、機密データ(個人データですが、ハッシュ化して保存するだけの種類のデータではありません)をローカルストレージに保存することは避けられません。

これは推奨される方法ではないことを受け入れますが、データを保護するために次のようにしています。

  • スタンフォードのjavascript暗号ライブラリとAES-256を使用して、ローカルストレージに入るすべてのものを暗号化する
  • ユーザーパスワードは暗号化キーであり、デバイスに保存されていません
  • sslを介して単一の信頼されたサーバーから(オンラインのときに)すべてのコンテンツを提供する
  • owasp antisamyプロジェクトを使用して、サーバーのローカルストレージとの間のすべてのデータを検証する
  • *を使用せずにappcacheのネットワークセクションで、信頼されたサーバーとの接続に必要なURIのみを一覧表示する
  • 一般に、OWASP XSSチートシートで提案されているガイドラインを適用しようとする

私は悪魔がしばしば詳細にあることを感謝し、ローカルストレージとJavaScriptベースのセキュリティ全般について多くの懐疑論があることを知っています。誰もが存在するかどうかについてコメントできますか:

  • 上記のアプローチの根本的な欠陥?
  • そのような欠陥の可能な解決策はありますか?
  • html 5アプリケーションが長期間オフラインで機能する必要がある場合にローカルストレージを保護するより良い方法はありますか?

助けてくれてありがとう。


「これは推奨されない慣行だと認めます」 -そうですか?それが実際に作られているのとは正反対ではないでしょうか?
hakre 2013年

2
明確にするために、機密データをローカルストレージに保存することはお勧めしません。
user1173706 2013年

そのように、大規模なネットワークを介して機密データを渡すべきではありませんか?
hakre 2013年

@ user1173706なぜアプリケーションはオフラインで長時間実行しなければならないのですか?ユーザーはどのような人ですか?どのブラウザをサポートする必要がありますか?私はそれは可能だと思いますが、あなたのシナリオの詳細を知る必要があります
Benjamin Gruenbaum 2013年

@ベンジャミン私は質問を更新しました。ありがとう。
user1173706 2013年

回答:


74

WebCrypto

クライアント側(ブラウザ)のJavaScriptにおける暗号化に関する懸念事項を以下に示します。これらの懸念事項の1つを除くすべては、現在十分にサポートされているWebCrypto APIには適用されません。

オフラインアプリの場合でも、安全なキーストアを設計して実装する必要があります。

補足:Node.jsを使用している場合は、組み込みの暗号化 APIを使用します。

ネイティブJavascript暗号化(WebCrypto以前)

私の主な関心事はlocalStorage、あなたのサイトのを読んでいるコンピューターに物理的にアクセスできる人であると思います。そして、暗号化がそのアクセスを防ぐのを助けることを望んでいます。

誰かが物理的にアクセスできる場合、あなたは他の攻撃にもさらされており、読書よりも悪いです。これらには、キーロガー、オフラインスクリプトの変更、ローカルスクリプトインジェクション、ブラウザキャッシュポイズニング、DNSリダイレクトが含まれます(ただし、これらに限定されません)。これらの攻撃は、ユーザーがマシンを危険にさらした後で使用した場合にのみ機能します。それにもかかわらず、このようなシナリオでの物理的なアクセスは、より大きな問題があることを意味します。

したがって、ローカル暗号化が貴重である限定的なシナリオは、マシンが盗まれた場合であることを覚えておいてください。

Stanford Javascript Crypto Libraryなど、必要な機能を実装するライブラリがあります。ただし、固有の弱点があります(@ircmaxellの回答のリンクで参照されています)。

  1. エントロピー/乱数生成の欠如;
  2. 安全なキーストアの欠如。つまり、ローカルに保存する場合、またはサーバーに保存する場合(オフラインアクセスを禁止する場合)は、秘密鍵をパスワードで保護する必要があります。
  3. 安全な消去の欠如;
  4. タイミング特性の欠如。

これらの弱点はそれぞれ、暗号の侵害のカテゴリに対応しています。言い換えれば、あなたは名前で「暗号」を持っているかもしれませんが、それは実際に目指している厳密さをはるかに下回ります。

そうは言っても、保険数理評価は「Javascript暗号は弱いので使用しないでください」ほど簡単ではありません。これは推奨ではなく、厳密に警告です。上記の弱点の露呈、直面するベクターの頻度とコスト、および失敗した場合の緩和または保険の能力を完全に理解する必要があります。その弱点にもかかわらず、あなたの露出を減らすかもしれませんが、限られた技術的能力を持つ泥棒に対してのみ。ただし、Javascript暗号は、その情報を標的とする決定的で有能な攻撃者に対して何の価値もないと想定する必要があります。多くの弱点が実装に固有であることがわかっている場合、データを「暗号化された」と呼ぶのは誤解を招くと考える人もいます。言い換えると、技術的なエクスポージャーをわずかに減らすことができますが、開示から財務的なエクスポージャーを増やします。もちろん、それぞれの状況は異なります-技術的なエクスポージャーを財務上のエクスポージャーに削減する分析は重要です。これは例証となる類推です:一部の銀行では、固有のリスクにもかかわらず、弱いパスワードを要求します。これは弱いパスワードによる損失への露出が、強力なパスワードをサポートするエンドユーザーのコストよりも少ないためです。

the前の段落を読んで、「ブライアンという名前のインターネット上の誰かがJavascript暗号を使用できると言っている」と思った場合は、Javascript暗号を使用しないください。

質問で説明されている使用例では、ユーザーがローカルパーティションまたはホームディレクトリを暗号化し、強力なパスワードを使用する方が理にかなっているようです。このタイプのセキュリティは、一般に十分にテストされ、広く信頼されており、一般に利用可能です。


2011年からNCCグループが提供する「JavaScriptは暗号化を使用しないでください」の一般的なスタンスのために利用可能な追加のドキュメント(引用)があります:有害と考えられJavaScriptの暗号化(キャッチ-22のダウンロードを確認するためのツールをダウンロードするのに顕著による... PRNG品質…など)
amcgregor

58

まあ、ここでの基本的な前提は、いいえ、まだ安全ではありません。

基本的に、JavaScriptで暗号を実行することはできません:JavaScript Crypto考慮された有害

問題は、暗号コードをブラウザーに確実に取り込むことができないことです。たとえ可能であっても、JSは安全に実行できるようには設計されていません。そのため、ブラウザーに暗号化コンテナー(Encrypted Media Extensionsが提供しますが、DRMの目的で反対される)があるまで、安全に行うことはできません。

「より良い方法」については、今のところありません。あなたの唯一の選択肢は、データをプレーンテキストで保存し、最高のものを期待することです。または、情報をまったく保存しないでください。どちらにしても。

あなたはどちらの場合それは、または必要なセキュリティのその種を、そしてあなたは、ローカルストレージを必要とする、カスタムアプリケーションを作成します...


8
ダウンボーター:より良い答えを提供できますか?これはやや物議を醸す問題であり、セキュリティの専門家(および非専門家も)の間で大きな不一致があるため、別の視点を共有する価値があると思います。別の理由で反対票を投じているのでない限り、その場合、この答えをどのように改善できますか?
ircmaxell 2013年

9
@ircmaxell私ではありませんが、私はこの答えに同意しません。「問題は、暗号化コードをブラウザーに確実に取り込むことができないことです。たとえ可能であっても、JSはそれを安全に実行できるように設計されていません。」- なぜ?何固有の問題は?Stanford JavaScript暗号化ライブラリを使用して、暗号化/復号化できます。ハッシュすることができ、すべてを安全に行うことができます。他の言語で構築されたアプリのように、標準のcrpytoを実行するJSのオフラインアプリには、固有の問題はありません。
Benjamin Gruenbaum 2013年

11
@BenjaminGruenbaum:問題は、暗号コードがサードパーティのコードとやり取りする必要がある場所が複数あることです。リンクした記事の要点は、実行環境を制御できないことです。したがって、Stanford Crypto libをインストールします。次に、一部のブラウザプラグインがオーバーライドsjcl.encryptして、キーを攻撃者に電子メールで送信するとどうなりますか?JSでは100%可能であり、それを止めるためにあなたができることは何もありません。そしてそれが根本的なポイントです。他のJSがデータに対して厄介なことをしないようにする「セキュリティ」メカニズムはありません。そして、それは問題です。
ircmaxell 2013年

13
@ircmaxell犬と一緒に寝るなら、ノミで目を覚まさないと期待することはできません。ユーザーがマルウェアアドオンをインストールする場合、それはユーザーがPCにウイルスをインストールするのと同じですが、それと同じです。JavaまたはCプログラムは、できるだけ安全にすることができますが、攻撃者がねじ込まれたコードを実行できるようになるとすぐに。JSでも同じです。アドオンは魔法のようにブラウザに表示されるだけではありません。さらに、暗号化された情報を保存しなくても、ユーザーがマルウェアを持っている場合は、データがライブでハイジャックされる可能性があるため、まったく役に立ちません。
Benjamin Gruenbaum 2013年

9
@BenjaminGruenbaum:そう思わない。通常のアプリケーションでは、必要があると思いますいずれか(メモリ位置を読み取るために)アプリ自体を危うくする、またはボックスにゲインrootアクセス(OSを損ないます)。どちらの場合も、通常の動作を行うだけではなく、何かをより深く妥協する必要があります。JSは、通常の動作でこれを許可します。これが問題です...
ircmaxell 2013年

12

このトピックの調査として、「Web暗号化APIを使用したTodoMVCの保護」というタイトルのプレゼンテーション(ビデオコード)があります。

Web暗号化APIを使用して、アプリケーションをパスワードで保護し、暗号化にパスワード派生キーを使用することにより、暗号化されたタスクリストをlocalStorageに格納します。パスワードを忘れたり紛失したりした場合、回復することはできません。(免責事項-これはPOCであり、実稼働での使用を目的としたものではありません。

他の回答が述べているように、これはクライアントコンピュータにインストールされているXSSまたはマルウェアの影響を受けます。ただし、データがサーバーに保存され、アプリケーションが使用中の場合、機密データもメモリに保存されます。オフラインサポートが魅力的な使用例になる可能性があることをお勧めします。

結局のところ、localStorageの暗号化は、システムまたはそのバックアップへの読み取り専用アクセス権を持つ攻撃者からのみデータを保護します。これにより、OWASPトップ10項目のA6機密データの公開に多少の防御が追加され、「このデータのいずれかがクリアテキストで長期間保存されていますか?」と回答できます。正しく。


3

これは本当に興味深い記事です。ローカルストレージの使用時にセキュリティを提供するために、JS暗号化の実装を検討しています。これは、デバイスが盗まれた(そして正しく実装された)場合にのみ保護を提供することは明らかです。キーロガーなどに対する保護は提供されません。ただし、キーロガーの脅威は、実行プラットフォーム(ブラウザー、ネイティブ)に関係なく、すべてのアプリケーションの問題であるため、JSの問題ではありません。最初の回答で参照された「有害なJavaScript暗号と見なされる」という記事に関して、私は1つの批判を持っています。「SSL / TLSを使用してこの問題を解決することはできますが、それは高価で複雑です」と述べています。私はこれは非常に野心的な主張だと思います(そしておそらく偏っています)。はい、SSLにはコストがかかります。

私の結論-クライアント側の暗号化コードの場所はありますが、すべてのアプリケーションと同様に、開発者はその制限を認識し、ニーズに適している場合は実装し、リスクを軽減する方法があることを確認する必要があります。


歴史的に、初期接続のネゴシエーションに関連する特別なコスト(機械的であり、金銭的ではない)がありました。企業が専用のSSLターミネーションアプライアンスを利用するようになると、証明書の発行と保証のコストを超えて経済的にコストがかかる可能性があります。今日、これらの問題の多くは解決されています。たとえば、後続のリクエストでの最初のハンドシェイクを回避するためのセッション持続時間の延長などです。
amcgregor

2

どのWebページにもアクセスできません(true)が、Chrome(ctl-shift-J)などの開発ツールを介して簡単にアクセスおよび編集できます。したがって、値を保存する前にカスタム暗号が必要です。

ただし、JavaScriptが(検証するために)復号化する必要がある場合は、復号化アルゴリズムが公開され、操作できます。

JavaScriptには、完全に安全なコンテナーと、jsインタープリターでのみ使用可能なプライベート変数および関数を適切に実装する機能が必要です。ただし、これはユーザーのセキュリティに違反します。追跡データは無罪で使用できるためです。

その結果、JavaScriptが完全に安全になることは決してありません。


-29

番号。

localStorageはどのWebページからもアクセスでき、キーがあれば、必要なデータを変更できます。

つまり、キーを安全に暗号化する方法を考案できれば、データを転送する方法は問題ではありません。クロージャ内にデータを含めることができれば、データは(ある程度)安全です。


19
「どのウェブページ」にもアクセスできません。現在のドメインのページにのみアクセスできます。
dtabuenc 2016

反対に、@ dtabuencを使用して、少し前にペンを作成しました。ハッキングすることなく、localStorage内のすべてのキーと値のペアが表示されます
hellol11 16

3
違う!ごめんなさい。ローカルストレージはドメインごとに分離されます。あるドメインで実行されているコードは、別のドメインによってローカルストレージに格納された値にアクセスできません。たとえば、google.comは大量のデータをローカルストレージに保存します。ペンの例では、google.comのキーをリストすることはできません。
dtabuenc 2016

@dtabuencがテストしました。そうです。
hellol11 16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.