WebCrypto
クライアント側(ブラウザ)のJavaScriptにおける暗号化に関する懸念事項を以下に示します。これらの懸念事項の1つを除くすべては、現在十分にサポートされているWebCrypto APIには適用されません。
オフラインアプリの場合でも、安全なキーストアを設計して実装する必要があります。
補足:Node.jsを使用している場合は、組み込みの暗号化 APIを使用します。
ネイティブJavascript暗号化(WebCrypto以前)
私の主な関心事はlocalStorage
、あなたのサイトのを読んでいるコンピューターに物理的にアクセスできる人であると思います。そして、暗号化がそのアクセスを防ぐのを助けることを望んでいます。
誰かが物理的にアクセスできる場合、あなたは他の攻撃にもさらされており、読書よりも悪いです。これらには、キーロガー、オフラインスクリプトの変更、ローカルスクリプトインジェクション、ブラウザキャッシュポイズニング、DNSリダイレクトが含まれます(ただし、これらに限定されません)。これらの攻撃は、ユーザーがマシンを危険にさらした後で使用した場合にのみ機能します。それにもかかわらず、このようなシナリオでの物理的なアクセスは、より大きな問題があることを意味します。
したがって、ローカル暗号化が貴重である限定的なシナリオは、マシンが盗まれた場合であることを覚えておいてください。
Stanford Javascript Crypto Libraryなど、必要な機能を実装するライブラリがあります。ただし、固有の弱点があります(@ircmaxellの回答のリンクで参照されています)。
- エントロピー/乱数生成の欠如;
- 安全なキーストアの欠如。つまり、ローカルに保存する場合、またはサーバーに保存する場合(オフラインアクセスを禁止する場合)は、秘密鍵をパスワードで保護する必要があります。
- 安全な消去の欠如;
- タイミング特性の欠如。
これらの弱点はそれぞれ、暗号の侵害のカテゴリに対応しています。言い換えれば、あなたは名前で「暗号」を持っているかもしれませんが、それは実際に目指している厳密さをはるかに下回ります。
そうは言っても、保険数理評価は「Javascript暗号は弱いので使用しないでください」ほど簡単ではありません。これは推奨ではなく、厳密に警告です。上記の弱点の露呈、直面するベクターの頻度とコスト、および失敗した場合の緩和または保険の能力を完全に理解する必要があります。その弱点にもかかわらず、あなたの露出を減らすかもしれませんが、限られた技術的能力を持つ泥棒に対してのみ。ただし、Javascript暗号は、その情報を標的とする決定的で有能な攻撃者に対して何の価値もないと想定する必要があります。多くの弱点が実装に固有であることがわかっている場合、データを「暗号化された」と呼ぶのは誤解を招くと考える人もいます。言い換えると、技術的なエクスポージャーをわずかに減らすことができますが、開示から財務的なエクスポージャーを増やします。もちろん、それぞれの状況は異なります-技術的なエクスポージャーを財務上のエクスポージャーに削減する分析は重要です。これは例証となる類推です:一部の銀行では、固有のリスクにもかかわらず、弱いパスワードを要求します。これは、弱いパスワードによる損失への露出が、強力なパスワードをサポートするエンドユーザーのコストよりも少ないためです。
the前の段落を読んで、「ブライアンという名前のインターネット上の誰かがJavascript暗号を使用できると言っている」と思った場合は、Javascript暗号を使用しないでください。
質問で説明されている使用例では、ユーザーがローカルパーティションまたはホームディレクトリを暗号化し、強力なパスワードを使用する方が理にかなっているようです。このタイプのセキュリティは、一般に十分にテストされ、広く信頼されており、一般に利用可能です。