検索
ホームページウェブフロントエンドjsチュートリアル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 テストも実施しました。必要に応じて試してみることもできます。


声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
es6数组怎么去掉重复并且重新排序es6数组怎么去掉重复并且重新排序May 05, 2022 pm 07:08 PM

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

JavaScript的Symbol类型、隐藏属性及全局注册表详解JavaScript的Symbol类型、隐藏属性及全局注册表详解Jun 02, 2022 am 11:50 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

原来利用纯CSS也能实现文字轮播与图片轮播!原来利用纯CSS也能实现文字轮播与图片轮播!Jun 10, 2022 pm 01:00 PM

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

JavaScript对象的构造函数和new操作符(实例详解)JavaScript对象的构造函数和new操作符(实例详解)May 10, 2022 pm 06:16 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

JavaScript面向对象详细解析之属性描述符JavaScript面向对象详细解析之属性描述符May 27, 2022 pm 05:29 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

javascript怎么移除元素点击事件javascript怎么移除元素点击事件Apr 11, 2022 pm 04:51 PM

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

整理总结JavaScript常见的BOM操作整理总结JavaScript常见的BOM操作Jun 01, 2022 am 11:43 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。

foreach是es6里的吗foreach是es6里的吗May 05, 2022 pm 05:59 PM

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

SublimeText3 中国語版

SublimeText3 中国語版

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

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境