Skip to content

6.Rust与WebAssembly

Rust的WebAssembly运行时库

Rust与WebAssembly的结合为构建高性能、安全且开放的WebAssembly应用提供了许多优势。

文档:https://www.rust-lang.org/zh-CN/what/wasm

以下是一些与Rust和WebAssembly相关的库和工具:

  1. wasm-bindgen:这是一个工具,可以轻松地将Rust代码与WebAssembly之间生成绑定代码,使它们可以在JavaScript中调用。它简化了Rust和WebAssembly之间的互操作性。
  2. web-sys:这是一个Rust库,提供了对Web平台API的预打包绑定。使用web-sys,您可以在Rust中直接调用浏览器的功能,而无需手动编写JavaScript。
  3. wasm-pack:这是一个用于构建、打包和发布Rust WebAssembly包的工具。它可以将Rust WebAssembly模块发布到npm等包仓库中心,并与webpack、Parcel等工具一起使用。
  4. yew:这是一个现代的Rust前端框架,用于构建Web应用程序。它使用WebAssembly作为目标,允许您在整个Web应用程序中使用Rust。
  5. source-map:如果您需要在WebAssembly中处理源映射,可以使用Rust来提高性能。Rust不会强迫您在明确表达意图和运行时性能之间做出选择。

总之,Rust和WebAssembly的结合为构建高性能、安全且现代的Web应用提供了强大的工具和生态系统。

优秀的Rust WebAssembly项目

文档:https://www.rust-lang.org/zh-CN/what/wasm

以下是一些与Rust和WebAssembly相关的优秀项目:

  1. deno:作为Node.js的替代,deno旨在为TypeScript/Javascript提供更现代、更安全、更强大的运行时。它内置了许多强大的工具,用于打包、编译成可执行文件、文档、测试、lint等.
  2. alacritty:这是一个跨平台、基于OpenGL的终端,性能极高且支持自定义和可扩展性.
  3. starship:一个命令行提示,支持任何shell,包括zsh。它简单易用、非常快且高度可配置,同时支持智能提示.
  4. MeiliSearch:一个轻量级搜索平台,用于终端用户提供边输入边提示的即刻搜索功能。适用于网页端或APP的搜索条.
  5. swc:Typescript/Javascript编译器,用于编译、压缩和打包JS。被Next.js、Parcel、Deno等知名项目使用,性能非常高.
  6. yew:一个正在活跃开发的Rust/Wasm框架,用于构建Web应用.
  7. firecracker:一个安全、高性能的无服务计算虚拟机,由Amazon公司开发,为AWS部分云计算服务提供支持.
  8. nushell:一个全新的shell,使用Rust实现,具有现代化特性,例如使用SQL语法来选择内容.
  9. tokio:一个异步IO的运行时,提供了I/O、网络、调度、定时器等异步编程所必须的功能和工具,性能和功能都异常强大.
  10. AppFlowy:Notion的开源实现,使用Rust和Flutter构建,用于用户文档和数据的管理.
  11. Bevy:一个数据驱动的游戏引擎,支持2D和3D图形开发,社区活跃且更新快.
  12. actix-web:全世界最快的web框架之一,功能丰富,性能强大.
  13. iced:一个跨平台GUI库,具有简单易用、模块化设计、响应式布局等优点.
  14. wasmer:业界领先的WASM运行时,支持WASI和Emscripten.
  15. ruffle:用Rust写的Flash Player模拟器,支持桌面端和Web端,通过WASM提供支持.
  16. rustdesk:国内团队开发的一款远程桌面软件,使用Rust和Flutter构建.
  17. RustPython:使用Rust实现的Python解释器,支持Python3.
  18. vector:一个性能很高的数据采集agent,用于采集本地的日志、监控等数据,发送到远程的kafka、jaeger等数据下沉端.
  19. mdbook:基于markdown文件自动创建在线电子书的工具.
  20. zola:静态网站生成器,类似hugo.

前端加密实践:利用Rust与WebAssembly封装安全的加密工具

在当前日益重视数据安全和隐私保护的时代,前端应用中数据的安全传输和存储显得尤为重要。本文将详细介绍一个关于使用Rust语言结合WebAssembly(WASM)技术,在前端环境中实现高效且安全的加密功能的调研与实践过程。

一.背景知识介绍及目标

前端加密技术

前端加密技术是指在客户端(通常是浏览器)执行加密操作的技术。这种技术允许数据在发送到服务器之前进行加密,从而增强了数据的安全性和隐私保护。前端加密技术通常使用JavaScript来实现,但近年来,随着WebAssembly(Wasm)的发展,前端加密性能得到了显著提升。

前端加密技术主要包括以下几种:

对称加密算法:如AES(高级加密标准)。这种算法使用相同的密钥进行加密和解密。数据的安全性依赖于密钥的保密性。AES算法在前端加密中广泛使用,因为它既安全又高效;非对称加密算法:如RSA。这种算法使用一对密钥,一个用于加密(公钥),另一个用于解密(私钥)。公钥可以公开,而私钥必须保密。非对称加密算法在数字签名和密钥交换等场景中非常有用;哈希算法:如MD5和SHA-256。这些算法将任意长度的数据映射为固定长度的哈希值。哈希算法是不可逆的,即无法通过哈希值还原原始数据。哈希算法常用于验证数据的完整性和生成数字签名。

在前端加密中,还需要考虑一些额外的因素,如加密性能、浏览器兼容性以及加密密钥的管理。为了解决这些问题,开发者通常会使用一些专门的加密库,如crypto-js,这些库提供了丰富的加密功能,并且针对Web环境进行了优化。需要注意的是,虽然前端加密可以增强数据的安全性,但它并不能完全防止数据泄露。因此,在后端也需要采取相应的安全措施来保护数据。在实际应用中,前端加密通常与其他安全机制(如HTTPS、访问控制等)结合使用,以提供更全面的数据保护。

AES加密

AES加密有AES-128、AES-192、AES-256三种,分别对应三种密钥长度128bits(16字节)、192bits(24字节)、256bits(32字节)。当然,密钥越长,安全性越高,加解密花费时间也越长。默认的是 AES-128,其安全性完全够用。

AES 算法为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下:

图片

AES有五种加密模式(CBC、ECB、CTR、OCF、CFB),分组密码有五种工作体制:

1.电码本模式(Electronic Codebook Book (ECB));

2.密码分组链接模式(Cipher Block Chaining (CBC));

3.计算器模式(Counter (CTR));

4.密码反馈模式(Cipher FeedBack (CFB));

5.输出反馈模式(Output FeedBack (OFB))。

WebAssembly

WebAssembly(简称Wasm)是一种为浏览器设计的二进制指令格式,它使得开发者能够将以其他语言(如C、C++、Rust等)编写的代码编译成WebAssembly格式,然后在现代网络浏览器中高效、安全地运行。WebAssembly的设计初衷是为了解决JavaScript在性能上的瓶颈,同时保持与Web平台的兼容性。

WebAssembly的主要特点包括:

高效性:WebAssembly代码接近原生应用的运行速度,可以在不同的平台上以接近本地速度运行,从而提升了应用程序的性能。

安全性:WebAssembly被限制在一个安全的沙箱执行环境中,遵循浏览器的同源策略和授权策略,确保了代码的安全运行。

可移植性:WebAssembly是一种开放的、与平台无关的二进制格式,可以在不同的浏览器和平台上运行,无需进行额外的修改。

兼容性:WebAssembly设计为与现有的Web技术无缝集成,可以嵌入到JavaScript代码中,或者作为独立的模块运行。此外,它还支持与其他网络技术的和谐共处,保持向后兼容。

WebAssembly的应用场景非常广泛,包括但不限于在线游戏、视频与音频编解码器、定制化的数据压缩、3D模型渲染、媒体编辑工具、语音合成与语音识别、客户端的计算机视觉等。此外,WebAssembly还可以用于服务端执行不可信任的代码,如服务端应用、移动混合原生应用等。

总的来说,WebAssembly为开发者提供了一种新的方式来提升Web应用的性能和安全性,使得更多的高级语言编写的应用程序能够在Web平台上高效运行。

Rust语言

Rust是一种现代的系统级编程语言,由Mozilla主导开发并于2010年首次发布。Rust的设计初衷是为了克服C++等传统系统级语言中常见的内存安全问题,同时又不牺牲性能。Rust的核心理念在于提供“零开销抽象”,这意味着程序员可以在享受高级别抽象带来的便利的同时,还能保持接近C或C++的运行速度。

Rust与加密安全性

在加密领域,Rust的重要性体现在其严格的内存管理模型上。Rust通过所有权系统和借用 checker 机制有效地预防了诸如缓冲区溢出、空指针解引用、数据竞争等内存错误,这类错误在处理敏感信息如密钥和加密数据时可能导致严重的安全漏洞。因此,使用Rust开发加密库能够极大地提高系统的安全性,减少因编程错误引发的安全风险。

高性能加密

Rust支持无垃圾回收的内存管理,允许开发者直接操作内存,这对于加密算法实现中的密集计算和低延迟场景至关重要。Rust编译器可以生成高效的本机代码,从而让加密算法在运行时达到接近C语言的性能水平。

并发安全

Rust强调并发安全,其语言特性确保了多线程环境下的数据一致性。加密库常常需要在多线程环境下工作,如处理大量并发加密请求,此时Rust提供的强大并发控制工具可以有效防止数据竞争和其他并发相关的bug。

二、项目实施步骤

  1. 选择与开发Rust加密库:首先选定magiccrypto这样的可信加密库作为基础支持,基于此开发一个专门针对AES加密/解密操作的模块。
  2. Rust到WebAssembly的编译:使用wasm-pack等工具将Rust加密模块编译成WebAssembly模块,确保生成的.wasm文件可在浏览器环境中安全、高效地运行。
  3. JavaScript接口封装:创建JavaScript层适配代码,借助WebAssembly的导入导出机制,将Rust加密API暴露给JavaScript调用,实现两者之间的无缝集成。
  4. 前端项目的集成:在实际前端应用中引入编译好的WebAssembly加密模块,并编写相关业务逻辑以实现在用户登录密码加密、敏感信息传输加密等场景下的应用。

三、实践细节与挑战

本文采用rust+wasm的方法加密前端AES算法中的key和iv,避免在浏览器编译的过程中明文暴漏出来。操作步骤如下:

Step1 创建Rust项目:

官方文档地址:https://rustwasm.github.io/docs/book/game-of-life/hello-world.html

目录如下

图片

Step2 实现加密逻辑:

引入加密库MagicCrypt

MagicCrypt地址:https://github.com/magiclen/rust-magiccrypt

MagicCrypt是一个Java/PHP/NodeJS/Rust库,用于使用数据加密标准(DES)或高级加密标准(AES)算法加密/解密字符串、文件或数据。它支持CBC分组密码模式、PKCS5填充以及64、128、192或256位的密钥长度。如果加密数据是字符串,它将自动格式化为Base64。

需要设置Rust开发环境:rustup

图片

调用加密方法

图片

Step3 打包为WebAssembly依赖文件:

wasm-pack build

获得pkg文件

Pkg文件目录如下

图片

Step4 集成到前端项目:

将生成的pkg文件夹复制到前端项目的适当路径下。

在前端项目的package.json文件中添加指向pkg文件夹中JavaScript绑定文件的引用,并运行npm install安装本地依赖。

在Vite配置文件vite.config.js中启用WASM插件以便正确加载和解析.wasm文件:

图片

在package.json中输入pkg的地址

图片

Npm install

在vite.config.js中安装

图片

图片

Step5 在对应地方引入所需的加密函数

图片

将需要加密的内容传入引入的函数

在页面调用

图片

图片

即可获取加密后的内容

图片

Step6 将加密后的内容解密验证

图片

解密得到前端加密之前的内容,加密实践成功

将前端加密结果发给后端,后端解密成功

图片

通过以上方法,我们可以成功地在前端环境中利用Rust和WebAssembly的优势,构建一个高效、安全的加密解决方案,极大地增强了应用程序的数据安全保障能力。同时,这一方案也强调了综合运用多种安全措施的重要性,包括前端加密、HTTPS协议以及严格的后端数据保护策略等。

Released under the MIT License.