Javascript を使用して暗号化および復号化する
Opal Web サイトを作成するときに私たちが直面した課題は、ブラウザーで暗号化および復号化する信頼できる方法を見つけることでした。
この記事では、ブラウザ側の暗号化が直面する課題について説明し、最近の技術の進歩によって提供されるソリューションを特定します。
Web アプリケーションの暗号化のための 3 つのオプション
すべてのブラウザでサポートされている言語は JavaScript のみです。 Opal のような Web アプリケーションは、最新のブラウザで実行できるように JavaScript で作成されています。これらのアプリケーションが暗号化関数を使用する場合は、JavaScript が暗号化関数にアクセスできる必要があります。
現在、暗号化関数をブラウザの JavaScript に公開するオプションは 3 つだけです:
1. プラグイン暗号化を使用する
プラグインは、ブラウザ内で実行され、JavaScript によって呼び出すことができるコンパイルされたコードを指します。
たとえば、Java や Flash に存在する暗号化ライブラリ。このアプローチは通常、非常にパフォーマンスが高いですが、ユーザーはブラウザ プラグインをインストールする必要があり、これは人々が (公共のコンピューターを使用している場合には) 実行したくない、または実行できないことです。
もう 1 つのオプションは、Chrome ブラウザの NaCl クライアント (ネイティブ クライアント) プログラムを使用することです。これにより、C または C++ からコンパイルされたマシン コードを実行できます。繰り返しますが、このアプローチは非常にパフォーマンスが高いですが、NaCl クライアント プログラムは Chrome ブラウザーでのみ使用できます。
これらのプラグインと NaCl クライアント プログラムには速度の点で利点がありますが、ユーザーは特別なプラグインを使用するか、特定のブラウザを使用する必要があるため、このアプローチの移植性はあまり良くありません。
2. Web 暗号化 API を使用する
今後の Web 暗号化 API は、JavaScript にネイティブの基本暗号化インターフェイスを提供し、Web アプリケーションの暗号化と復号化を高速化できるようにします。ただし、このインターフェースはまだドラフト段階にあり、主流のブラウザーがこのテクノロジーを採用するまでには長い時間がかかるでしょう。現在、ほとんどのブラウザで使用できる関数は crypto.getRandomValues() 関数のみです。
これは、Web 暗号化 API が広く使用されるまで、実用的なブラウザ側の暗号化ソリューションではありません。
3. JavaScript を直接使用して暗号化する
このソリューションの利点は、移植性の高さです。すべてのブラウザーは JavaScript を実行できます。つまり、すべてのブラウザーは JavaScript で記述された暗号化ライブラリを呼び出すことができます。
JavaScript の暗号化には、セキュリティと速度という 2 つの主な欠点があります。これら 2 つの欠点について順番に説明します。
JavaScript 暗号化は安全になる可能性があります
ある記事では、「JavaScript 暗号化は有害である」と主張し、この主張を裏付ける多くの証拠を列挙しています。
記事内の一部の見解は正確ではなくなりました。たとえば、この記事では、Math.random() 関数は乱数の適切なソースではないため、暗号化に必要な十分な乱数を取得することは不可能であると述べています。 Math.random() 関数は確かに乱数の良いソースではありません。最新のブラウザでは、十分な数の乱数を取得するための crypto.getRandomValues() 関数がすでに提供されています。
このスレッドには、JavaScript 暗号化が悪い考えであることを証明する例がかなりありますが、それは理にかなっています。この回答は、最初の投稿の多くの議論に有効に反論し、JavaScript 暗号化の 2 つの有効な使用例、つまりエンドツーエンドのメッセージ暗号化 (つまり、ホスト アクセスから保護するアプリケーション) と安全なリモート パスワード認証を指摘しています。これらはまさに Opal 暗号化の使用シナリオであるため、JavaScript 暗号化を使用するのは非常に自然です。
JavaScript 暗号化は高速に可能
最近まで、JavaScript は安全な暗号化に必要な複雑な計算を実行するのに時間がかかりました。これにより、多くのアプリケーションがプラグインによって提供される暗号化機能に依存することになりますが、これは移植性がなく、ユーザーにとって迷惑です。
幸いなことに、JavaScript のパフォーマンスは近年大幅に向上したため、暗号化操作に完全に JavaScript を使用することが可能になりました。現在、選択できる JavaScript 暗号化ライブラリは多数あります (リンク 1、リンク 2、リンク 3、リンク 4、リンク 5、リンク 6、リンク 7、リンク 8、リンク 9)。
そこで、どの図書館を選ぶかが問題になります。
NaCl、信頼性の高い C 言語暗号化ライブラリ
NaCl (「ソルト」と発音) は、対称鍵暗号化、復号化、および公開鍵署名認証のためのアプリケーション関数を提供する C 言語ライブラリです。これは暗号学者によって書かれており、暗号コミュニティではよく知られており、信頼されています。問題の 1 つは、NaCl が JavaScript ではなく C で記述されていることです。
js-NaCl: NaCl を JavaScript にコンパイルする
幸いなことに、NaCl を LLVM バイトコードにコンパイルし、emscripten を使用してこれらのバイトコードを JavaScript にコンパイルできます。さらに、LLVM コンパイラはコンパイル中に多くの最適化を実行できるため、結果の JavaScript コードも最適化されます。したがって、NaCl ライブラリを JavaScript にコンパイルして、ブラウザーで実行できるようにすることができます。
js-nacl プロジェクトはまさに、JavaScript にコンパイルされた NaCl 暗号化ライブラリです。
asm.js は高速です!
さらに良いことに、emscripten によってコンパイルされたコードは、asm.js とも呼ばれる JavaScript のサブセットです。 asm.js は、JavaScript とよく似たアセンブリ言語と考えることができます。ブラウザーが asm.js のコード ブロックを検出すると、それを効率的なマシン コードにコンパイルし、ネイティブ コードに近い速度で実行します。
現在、asm.js の最適化をサポートしているのは Firefox ブラウザーのみです。これにより、Firefox での js-nacl 暗号化と復号化が非常に高速になり、特定の操作に応じて Chrome ブラウザよりも 2 ~ 8 倍速くなります。しかし、Chrome の場合でも、js-nacl は高速であり、テストした他のすべての暗号化ライブラリを上回っています。
NaCl のような信頼できる暗号化ライブラリと最新のブラウザでの高速実行により、Opal のような Web アプリケーションで js-nacl ライブラリを使用することは良いアイデアになります。
同じ理由で、Opal は emscripten によってコンパイルされた scrypt ライブラリの asm.js バージョンを使用してキーを拡張します (この記事では有効になっています)。プロジェクトのメンテナが提供する js-nacl と js-scrypt のパフォーマンスの比較を確認できます。また、ブラウザーのバージョン間のパフォーマンスの違いを理解するために、js-nacl の jsperf テストも実施しました。必要に応じて試してみることもできます。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

WebSocket と JavaScript を使用してオンライン予約システムを実装する方法 今日のデジタル時代では、ますます多くの企業やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実装することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実装する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

使用法: JavaScript では、insertBefore() メソッドを使用して、DOM ツリーに新しいノードを挿入します。このメソッドには、挿入される新しいノードと参照ノード (つまり、新しいノードが挿入されるノード) の 2 つのパラメータが必要です。

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

JavaScript は Web 開発で広く使用されているプログラミング言語であり、WebSocket はリアルタイム通信に使用されるネットワーク プロトコルです。 2 つの強力な機能を組み合わせることで、効率的なリアルタイム画像処理システムを構築できます。この記事では、JavaScript と WebSocket を使用してこのシステムを実装する方法と、具体的なコード例を紹介します。まず、リアルタイム画像処理システムの要件と目標を明確にする必要があります。リアルタイムの画像データを収集できるカメラ デバイスがあるとします。
