基于wasm的探索与研究(四)

本文对比了openssl.wasm与原生openssl在加密解密任务上的性能差异,并探讨了WebAssembly(WASM)运行效率较低的原因。此外,还介绍了WASM的安全特性和在不同领域的应用前景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

wasm runtime 性能测试

上一篇文章分享了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

    • 加密

      /文件大小100M300M500Mkey数据大小
      B0.197s0.970s1.418s128bit
      C0.244s1.421s1.278s128bit
      R0.203s0.587s1.145s128bit
      M0.303s1.123s1.710s128bit
    • 解密

      式/文件大小100M300M500Mkey数据大小
      ECB0.309s1.014s1.275s128bit
      CBC0.260s0.946s1.630s128bit
      CTR0.322s1.081s1.591s128bit
      GCM0.429s1.283s1.842s128bit
  • Openssl.wasm

    • 加密

      /文件大小100M300M500Mkey数据大小
      ECB1.775s5.326s8.996s128bit
      CBC1.805s5.563s9.452s128bit
      CTR2.011s6.133s10.350s128bit
    • 解密

      /文件大小100M300M500Mkey数据大小
      ECB1.894s5.780s9.186s128bit
      CBC1.880s5.892s10.123s128bit
      CTR2.168s6.297s11.424s128bit

结论

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 既能保证安全性避免插件代码越权,也能与开发语言解耦、有利于插件生态的繁荣。

更多使用场景参见 官方文档

未来方向

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

参考文档

在web之外运行WebAssembly的系统接口–原文 作者:Lin Clark

在web之外运行WebAssembly的系统接口–译文

WebAssembly 线上研讨会2020年8月29日 · 线上活动

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值