上一篇文章分享了wasmer runtime,编译好的openssl.wasm文件可以独立运行,这篇文章分享openssl.wasm和原生openssl之间的性能对比。

测试硬件

  • 主机 MacBook Pro
  • CPU 6-Core Intel Core i7 2.2 GHz/启动超线程
  • 内存 16GB
  • 磁盘 SSD

测试软件

  • Openssl LibreSSL 2.8.3
  • Openssl WASM openssl安装包版本 openssl 1.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 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

解密

模式/文件大小 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

Openssl.wasm

加密

模式/文件大小 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)。

因为WASM依赖的是V-ISA指令集,即完全依赖宿主环境提供的操作指令。所以如果要在真实的操作系统上运行,必须要有一个“虚拟机”来翻译这些指令并屏蔽具体系统调用之间的差异。即需要类似JVM的WASM VM,WASI便是定义这些抽象的系统调用抽象层,WASM平台的系统接口。从而实现"一次编译,到处运行"的特点。

另一个特点是WASM安全性,WASM采用了沙箱机制。这意味着代码不能直接与操作系统交互。那么它是如何利用系统资源的呢?宿主机(可能是浏览器,也可能是 WASM 运行时)将函数放入代码可以使用的沙箱中。即虚拟机完全负责权限的控制,所有系统调用由外围控制,隔离出沙箱环境,这样可以避免第三方库带来的安全问题。

从可移植性和安全性上来分析,openssl.wasm对比直接在主机上安装的openssl,效率低一点是有道理的,不仅如此,在不同平台上wasm的速度也是有差异的。目前wasm还在发展阶段,感兴趣的朋友可以继续关注wasm动态。

使用场景

浏览器中应用 WebAssembly 的场景,比如:

  • 将 C、C++、Rust 等语言编写的程序移植到浏览器
  • 游戏:
    • 需要快速打开的小游戏
    • AAA 级,资源量很大的游戏。
    • 游戏门户(代理/原创游戏平台)
  • 图形图像处理领域,如页游、数据可视化等
  • 加密工具
  • CAD 软件
  • 音视频编解码等等

非浏览器应用场景,官方文档中也列了一些,不过都比较抽象

  • Fastly 与其他服务商的边缘云
  • Node 与 npm(参见译文)

    • “WebAssembly 可以解决 Node 中最大的问题之一——如何获得接近原生速度,并像使用原生模块一样复用其他语言(如 C 与 C++)编写的代码,同时仍保持可移植性与安全性。 标准化这个系统接口是实现这一目标的第一步。”
    • “npm 极为感兴趣的是,WebAssembly 潜在具有扩展 npm 生态系统、并同时极大地简化在服务端 JavaScript 应用程序中运行原生代码过程的能力。 我们期待这个过程的结果。”
  • 插件系统。无论浏览器、IDE 还是任何其他地方的插件系统如果采用 WebAssembly 既能保证安全性避免插件代码越权,也能与开发语言解耦、有利于插件生态的繁荣。

更多使用场景参见官方文档:http://webassembly.org.cn/docs/use-cases/

未来方向

  • 添加后续特性到 WebAssembly 标准的过程
    • 直接操作 DOM
    • 共享内存的并发性
    • SIMD(单指令,多数据)
    • 异常处理
    • 其他改进——使开发者开发起来更简单
      • 一流的开发者工具
      • 垃圾回收
      • ES6 模块集成。

参考文档


Netwarps 由国内资深的云计算和分布式技术开发团队组成,该团队在金融、电力、通信及互联网行业有非常丰富的落地经验。Netwarps 目前在深圳、北京均设立了研发中心,团队规模30+,其中大部分为具备十年以上开发经验的技术人员,分别来自互联网、金融、云计算、区块链以及科研机构等专业领域。
Netwarps 专注于安全存储技术产品的研发与应用,主要产品有去中心化文件系统(DFS)、去中心化计算平台(DCP),致力于提供基于去中心化网络技术实现的分布式存储和分布式计算平台,具有高可用、低功耗和低网络的技术特点,适用于物联网、工业互联网等场景。
公众号:Netwarps