上一篇文章分享了wasmer runtime,編譯好的openssl.wasm文件能夠獨立運行,這篇文章分享openssl.wasm和原生openssl之間的性能對比。html
分別對 100/300/500 MB 進行屢次加密解密,獲得均值結果。注意,這裏有些模式並非標準的,因此沒有所有模擬,僅供參考。web
openssl 測試命令npm
#!/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}
加密安全
模式/文件大小 | 100M | 300M | 500M | key數據大小 |
---|---|---|---|---|
ECB | 0.197s | 0.970s | 1.418s | 128bit |
CBC | 0.244s | 1.421s | 1.278s | 128bit |
CTR | 0.203s | 0.587s | 1.145s | 128bit |
GCM | 0.303s | 1.123s | 1.710s | 128bit |
解密bash
模式/文件大小 | 100M | 300M | 500M | key數據大小 |
---|---|---|---|---|
ECB | 0.309s | 1.014s | 1.275s | 128bit |
CBC | 0.260s | 0.946s | 1.630s | 128bit |
CTR | 0.322s | 1.081s | 1.591s | 128bit |
GCM | 0.429s | 1.283s | 1.842s | 128bit |
加密網絡
模式/文件大小 | 100M | 300M | 500M | key數據大小 |
---|---|---|---|---|
ECB | 1.775s | 5.326s | 8.996s | 128bit |
CBC | 1.805s | 5.563s | 9.452s | 128bit |
CTR | 2.011s | 6.133s | 10.350s | 128bit |
解密併發
模式/文件大小 | 100M | 300M | 500M | key數據大小 |
---|---|---|---|---|
ECB | 1.894s | 5.780s | 9.186s | 128bit |
CBC | 1.880s | 5.892s | 10.123s | 128bit |
CTR | 2.168s | 6.297s | 11.424s | 128bit |
openssl.wasm與openssl根據不一樣加解密模式以及不一樣大小文件進行耗時對比來看,openssl.wasm速度沒有原生的openssl執行效率高。具體什麼緣由,我也很好奇,網上的資料並非不少,經過以前對wasm的研究我的理解多是由於wasm虛擬機致使運行速度不是那麼快。分佈式
WebAssembly的定義是基於堆棧的虛擬機的二進制指令格式。堆棧虛擬機模型是常見的內存管理結構,將數據和操做符壓入棧中並彈出逐次執行。wasm的二進制指令是虛擬指令集,虛擬指令集(V-ISA)能夠認爲是對平臺無關的一系列自定義操做符(如JVM),相對的,物理指令集(ISA)則是強依賴物理系統的(如Intel的x86-64)。ide
由於WASM依賴的是V-ISA指令集,即徹底依賴宿主環境提供的操做指令。因此若是要在真實的操做系統上運行,必需要有一個「虛擬機」來翻譯這些指令並屏蔽具體系統調用之間的差別。即須要相似JVM的WASM VM,WASI即是定義這些抽象的系統調用抽象層,WASM平臺的系統接口。從而實現"一次編譯,處處運行"的特色。
另外一個特色是WASM安全性,WASM採用了沙箱機制。這意味着代碼不能直接與操做系統交互。那麼它是如何利用系統資源的呢?宿主機(多是瀏覽器,也多是 WASM 運行時)將函數放入代碼可使用的沙箱中。即虛擬機徹底負責權限的控制,全部系統調用由外圍控制,隔離出沙箱環境,這樣能夠避免第三方庫帶來的安全問題。
從可移植性和安全性上來分析,openssl.wasm對比直接在主機上安裝的openssl,效率低一點是有道理的,不只如此,在不一樣平臺上wasm的速度也是有差別的。目前wasm還在發展階段,感興趣的朋友能夠繼續關注wasm動態。
瀏覽器中應用 WebAssembly 的場景,好比:
非瀏覽器應用場景,官方文檔中也列了一些,不過都比較抽象
Node 與 npm(參見譯文)
更多使用場景參見官方文檔:http://webassembly.org.cn/docs/use-cases/
在web以外運行WebAssembly的系統接口--原文 做者:Lin Clark
在web以外運行WebAssembly的系統接口--譯文
WebAssembly 線上研討會2020年8月29日 · 線上活動
Netwarps 由國內資深的雲計算和分佈式技術開發團隊組成,該團隊在金融、電力、通訊及互聯網行業有很是豐富的落地經驗。Netwarps 目前在深圳、北京均設立了研發中心,團隊規模30+,其中大部分爲具有十年以上開發經驗的技術人員,分別來自互聯網、金融、雲計算、區塊鏈以及科研機構等專業領域。Netwarps 專一於安全存儲技術產品的研發與應用,主要產品有去中心化文件系統(DFS)、去中心化計算平臺(DCP),致力於提供基於去中心化網絡技術實現的分佈式存儲和分佈式計算平臺,具備高可用、低功耗和低網絡的技術特色,適用於物聯網、工業互聯網等場景。公衆號:Netwarps