前の記事では、wasmerランタイムを共有しました。コンパイルされたopenssl.wasmファイルは独立して実行できます。この記事では、openssl.wasmとネイティブopensslのパフォーマンス比較を共有します。
テストハードウェア
- MacBookProをホストする
- CPU6コアIntelCore i7 2.2 GHz /ハイパースレッディングを有効にする
- RAM 16GB
- ディスクSSD
テストソフトウェア
- Openssl LibreSSL 2.8.3
- openssl WASMopensslインストールパッケージバージョンopenssl1.1.1d
- WASMER 1.0.0-alpha4
試験方法
100/300/500 MBを複数回暗号化および復号化して、平均的な結果を取得します。ここでの一部のモードは標準ではないため、参考のためにすべてのシミュレーションがあるわけではないことに注意してください。
opensslテストコマンド
#!/bin/bash
key="A665A45920422F9D417E4867EFDC4FB8"
iv="4632527467615238616971576a466653"
#file100、file300、file500
fileName="file100"
ecbEnFileName="ecb-en-${fileName}"
ecbDeFileName="ecb-de-${fileName}"
cbcEnFileName="cbc-en-${fileName}"
cbcDeFileName="cbc-de-${fileName}"
ctrEnFileName="ctr-en-${fileName}"
ctrDeFileName="ctr-de-${fileName}"
gcmEnFileName="gcm-en-${fileName}"
gcmDeFileName="gcm-dn-${fileName}"
echo "------start openssl-aes-128 encryption-------"
echo "------ECB Encryption-------"
time openssl enc -aes-128-ecb -in ${fileName} -out ${ecbEnFileName} -K ${key} -p
echo "------CBC Encryption-------"
time openssl enc -aes-128-cbc -in ${fileName} -out ${cbcEnFileName} -K ${key} -iv ${iv} -p
echo "------CTR Encryption-------"
time openssl enc -aes-128-ctr -in ${fileName} -out ${ctrEnFileName} -K ${key} -iv ${iv} -p
echo "------GCM Encryption-------"
time openssl enc -aes-128-gcm -in ${fileName} -out ${gcmEnFileName} -K ${key} -iv ${iv} -p
echo "#############################################################"
echo "------start openssl-aes-128 Decrypt-------"
echo "------ECB Decrypt-------"
time openssl enc -aes-128-ecb -d -in ${ecbEnFileName} -out ${ecbDeFileName} -K ${key} -p
echo "------CBC Decrypt-------"
time openssl enc -aes-128-cbc -d -in ${cbcEnFileName} -out ${cbcDeFileName} -K ${key} -iv ${iv} -p
echo "------CTR Decrypt-------"
time openssl enc -aes-128-ctr -d -in ${ctrEnFileName} -out ${ctrDeFileName} -K ${key} -iv ${iv} -p
echo "------GCM Decrypt-------"
time openssl enc -aes-128-gcm -d -in ${gcmEnFileName} -out ${gcmDeFileName} -K ${key} -iv ${iv} -p
openssl.wasmテストコマンド
#!/bin/bash
key="A665A45920422F9D417E4867EFDC4FB8"
iv="4632527467615238616971576a466653"
#file100、file300、file500
fileName="file500"
ecbEnFileName="aes/ecb-en-${fileName}"
ecbDeFileName="aes/ecb-de-${fileName}"
cbcEnFileName="aes/cbc-en-${fileName}"
cbcDeFileName="aes/cbc-de-${fileName}"
ctrEnFileName="aes/ctr-en-${fileName}"
ctrDeFileName="aes/ctr-de-${fileName}"
# 创建需要的文件,wasm文件运行,不会把数据写入磁盘,所以需要提前准备文件
touch ${ecbEnFileName}
touch ${ecbDeFileName}
touch ${cbcEnFileName}
touch ${cbcDeFileName}
touch ${ctrEnFileName}
touch ${ctrDeFileName}
echo "------start openssl-aes-128 encryption-------"
echo "------ECB Encryption-------"
time wasmer run openssl.wasm --dir=. -- enc -aes-128-ecb -in ${fileName} -out ${ecbEnFileName} --nosalt -K ${key}
echo "------CBC Encryption-------"
time wasmer run openssl.wasm --dir=. -- enc -aes-128-cbc -in ${fileName} -out ${cbcEnFileName} --nosalt -K ${key} -iv ${iv}
echo "------CTR Encryption-------"
time wasmer run openssl.wasm --dir=. -- enc -aes-128-ctr -in ${fileName} -out ${ctrEnFileName} --nosalt -K ${key} -iv ${iv}
echo "#############################################################"
echo "------start openssl-aes-128 Decrypt-------"
echo "------ECB Decrypt-------"
time wasmer run openssl.wasm --dir=. -- enc -aes-128-ecb -d -in ${ecbEnFileName} -out ${ecbDeFileName} --nosalt -K ${key}
echo "------CBC Decrypt-------"
time wasmer run openssl.wasm --dir=. -- enc -aes-128-cbc -d -in ${cbcEnFileName} -out ${cbcDeFileName} --nosalt -K ${key} -iv ${iv}
echo "------CTR Decrypt-------"
time wasmer run openssl.wasm --dir=. -- enc -aes-128-ctr -d -in ${ctrEnFileName} -out ${ctrDeFileName} --nosalt -K ${key} -iv ${iv}
試験結果
OpenSSL
暗号化
モード/ファイルサイズ | 100M | 300M | 500M | キーデータサイズ |
---|---|---|---|---|
ECB | 0.197秒 | 0.970秒 | 1.418秒 | 128ビット |
CBC | 0.244秒 | 1.421秒 | 1.278秒 | 128ビット |
クリック率 | 0.203秒 | 0.587秒 | 1.145秒 | 128ビット |
GCM | 0.303秒 | 1.123秒 | 1.710秒 | 128ビット |
復号化
モード/ファイルサイズ | 100M | 300M | 500M | キーデータサイズ |
---|---|---|---|---|
ECB | 0.309秒 | 1.014秒 | 1.275秒 | 128ビット |
CBC | 0.260秒 | 0.946秒 | 1.630秒 | 128ビット |
クリック率 | 0.322秒 | 1.081秒 | 1.591秒 | 128ビット |
GCM | 0.429秒 | 1.283秒 | 1.842s | 128ビット |
openssl.wasm
暗号化
モード/ファイルサイズ | 100M | 300M | 500M | キーデータサイズ |
---|---|---|---|---|
ECB | 1.775秒 | 5.326秒 | 8.996s | 128ビット |
CBC | 1.805s | 5.563秒 | 9.452秒 | 128ビット |
クリック率 | 2.011 | 6.133秒 | 10.350秒 | 128ビット |
復号化
モード/ファイルサイズ | 100M | 300M | 500M | キーデータサイズ |
---|---|---|---|---|
ECB | 1.894s | 5.780秒 | 9.186秒 | 128ビット |
CBC | 1、880年代 | 5.892秒 | 10.123秒 | 128ビット |
クリック率 | 2.168秒 | 6.297秒 | 11.424s | 128ビット |
結論として
さまざまな暗号化および復号化モードとさまざまなサイズのファイルによるopenssl.wasmとopensslの時間のかかる比較によると、openssl.wasmの速度はネイティブopensslの速度ほど効率的ではありません。具体的な理由も気になります。インターネット上にはあまり情報がありません。以前のwasmの研究についての私の個人的な理解は、wasm仮想マシンが原因で実行速度がそれほど速くないためかもしれません。
WebAssemblyの定義は、スタックベースの仮想マシンのバイナリ命令形式です。スタック仮想マシンモデルは、一般的なメモリ管理構造であり、データと演算子をスタックにプッシュし、それらをポップして連続して実行します。wasmのバイナリ命令は仮想命令セットです。仮想命令セット(V-ISA)は、プラットフォームに依存しない一連のカスタム演算子(JVMなど)と見なすことができます。対照的に、物理命令セット(ISA)は物理システムに強く依存します。 (Intelのx86-64など)。
WASMはV-ISA命令セットに依存しているため、ホスト環境によって提供される操作命令に完全に依存しています。したがって、実際のオペレーティングシステムで実行する場合は、これらの命令を変換し、特定のシステム呼び出し間の違いを保護するための「仮想マシン」が必要です。つまり、JVMと同様のWASM VMが必要であり、WASIは、これらの抽象システム呼び出し抽象化レイヤー、WASMプラットフォームを定義するシステムインターフェイスです。「一度コンパイルすれば、どこでも実行できる」という特徴を実現するために。
もう1つの機能は、サンドボックスメカニズムを使用するWASMのセキュリティです。これは、コードがオペレーティングシステムと直接対話できないことを意味します。では、システムリソースをどのように使用するのでしょうか。ホスト(ブラウザーまたはWASMランタイムの場合があります)は、コードが使用できるサンドボックスに関数を配置します。つまり、仮想マシンがアクセス許可の制御を完全に担当し、すべてのシステム呼び出しが周辺機器によって制御され、サンドボックス環境が分離されているため、サードパーティのライブラリによって引き起こされるセキュリティの問題を回避できます。
移植性とセキュリティの観点から、ホストに直接インストールされたopensslと比較すると、openssl.wasmの効率が低いことは理にかなっています。それだけでなく、プラットフォームごとにwasmの速度も異なります。Wasmはまだ開発段階にあり、興味のある友人は引き続きWasmのダイナミクスに注意を払うことができます。
使用するシーン
次のような、ブラウザでWebAssemblyを適用するシナリオ。
- C、C ++、Rust、その他の言語で書かれたプログラムをブラウザに移植する
- ゲーム:
- すぐに開く必要がある小さなゲーム
- たくさんのリソースを持つAAAレベルのゲーム。
- ゲームポータル(エージェント/オリジナルゲームプラットフォーム)
- ページゲーム、データ視覚化などのグラフィックスおよび画像処理フィールド。
- 暗号化ツール
- CADソフトウェア
- オーディオおよびビデオコーデックなど。
ブラウザー以外のアプリケーションのシナリオ。一部は公式ドキュメントにも記載されていますが、すべて比較的抽象的です。
- Fastlyおよびその他のサービスプロバイダーのエッジクラウド
-
ノードとnpm(翻訳を参照)
- 「WebAssemblyは、ノードの最大の問題の1つを解決できます。ネイティブの速度に近づき、移植性とセキュリティを維持しながら、ネイティブモジュールなどの他の言語(CやC ++など)で記述されたコードを再利用する方法です。標準化このシステムインターフェイスは、この目標を達成するための最初のステップです。」
- 「Npmは、WebAssemblyがnpmエコシステムを拡張すると同時に、サーバー側のJavaScriptアプリケーションでネイティブコードを実行するプロセスを大幅に簡素化する可能性があることに非常に興味を持っています。このプロセスの結果を楽しみにしています。」
- プラグインシステム。ブラウザ、IDE、その他のプラグインシステムに関係なく、WebAssemblyを採用すると、セキュリティを確保し、プラグインの不正なコードを回避できるだけでなく、開発言語から切り離すことができるため、プラグインエコロジーの繁栄につながります。
その他の使用シナリオについては、公式ドキュメントを参照してください:http://webassembly.org.cn/docs/use-cases/
未来方向
- WebAssembly標準に後続の機能を追加するプロセス
- DOMを直接操作する
- 共有メモリの同時実行
- SIMD(単一命令、複数データ)
- 例外処理
- その他の改善-開発者にとってより簡単に
- 一流の開発者ツール
- ガベージコレクション
- ES6モジュールの統合。
参照文書
-
システムインターフェイスはWebAssemblyをWebの外部で実行します-原作者:Lin Clark
-
WebAssemblyをWebの外部で実行するためのシステムインターフェイス--translation
-
WebAssemblyウェビナー2020年8月29日・オンラインイベント
Netwarpsは、中国のシニアクラウドコンピューティングおよび分散技術開発チームで構成されています。このチームは、金融、電力、通信、およびインターネット業界で非常に豊富な経験を持っています。Netwarpsは現在、深センと北京にR&Dセンターを持ち、チームサイズは30以上で、そのほとんどはインターネット、金融、クラウドコンピューティング、ブロックチェーン、科学研究機関などの専門分野から10年以上の開発経験を持つ技術者です。
Netwarpsは、セキュアストレージテクノロジー製品の開発とアプリケーションに重点を置いています。主な製品には、分散ファイルシステム(DFS)と分散コンピューティングプラットフォーム(DCP)があり、分散ストレージの提供と分散ネットワークテクノロジーに基づく分散に取り組んでいます。コンピューティングプラットフォームは、高可用性、低消費電力、低ネットワークという技術的特性を備えており、Internet ofThingsやIndustrialInternetなどのシナリオに適しています。
公式アカウント:Netwarps