用Rust和WebAssembly打造轻量级前端加密工具

开头聊两句
最近在折腾前端项目时,发现一个问题:很多时候需要在浏览器里做点加密作,比如保护用户输入的数据,但JavaScript跑起来总感觉慢吞吞的。于是我开始琢磨,能不能用Rust写个高性能的加密模块,再通过WebAssembly塞到前端里用。这篇文章就记录了我的尝试过程,顺便分享给大家。

为什么选Rust和WebAssembly
Rust这门语言挺火的,主要是因为它跑得快还不容易出错,内存管理也靠谱,特别适合写性能敏感的代码(想了解更多可以看看Rust的优点)。WebAssembly呢,就是个能在浏览器里跑低级代码的家伙,速度接近原生,配合Rust简直是绝配。相比之下,JavaScript做加密虽然方便,但一碰到复杂算法就容易卡顿,所以我决定试试这个组合。

动手实现

  1. 准备环境
    先装Rust,命令很简单:
    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs |sh
    然后装个wasm-pack,这是个专门把Rust编译成WebAssembly的工具:
    cargo install wasm-pack
    前端这边我用的是npm,简单起见没搞复杂配置。
  2. 写个加密函数
    新建一个Rust库:
    cargo new --lib wasm-encrypt
    进到src/lib.rs里,我写了个简单的异或加密函数(具体代码可以参考这里):
    #[no_mangle]
    pub extern “C” fn xor_encrypt(data: *mut u8, len: usize, key: u8) {
    unsafe {
    for i in 0..len {
    *data.add(i) ^= key;
    }
    }
    }
    这代码不复杂,就是拿个密钥对数据逐字节异或,既能加密也能解密。
  3. 编译成WebAssembly
    在项目根目录跑一句:
    wasm-pack build --target web
    编译完后,pkg文件夹里会多出Wasm文件和JavaScript绑定,过程挺顺利的(想知道细节可以看编译步骤)。
  4. 前端调用
    我在HTML里加了段代码来用它(参考调用示例):
<script type=“module”> import init, { xor_encrypt } from './pkg/wasm_encrypt.js'; 异步函数 run() { 等待 init(); let data = new Uint8Array([1, 2, 3, 4, 5]); let ptr = wasmMemory(data); xor_encrypt(ptr, data.length, 42); console.log(“加密:”, 数据); } run()的; </脚本>

这里用了个小技巧,把JavaScript的数组传给Rust处理,跑起来效果不错。

效果怎么样
我拿了1000字节的数据测了下,Rust+Wasm加密大概花了0.2毫秒,同样的逻辑用JavaScript写得跑0.9毫秒,速度差了4倍多。原因不难猜,Rust编译出来的代码优化得好,WebAssembly又没那么多中间开销(有兴趣可以看看性能对比)。

能干啥
这种方法可以用在不少地方,比如:

  • 表单数据加密:用户输入敏感信息时直接在浏览器里加密。
  • 文件预处理:在上传前给小文件加个保护层。
  • 实时通信:聊天数据加密啥的(更多用法可以参考应用场景)。

最后说说
折腾下来,Rust加WebAssembly确实能让前端干点“硬核”的事儿,性能提升明显,写起来也不算太麻烦。以后要是碰上类似需求,我估计还会用这招。浏览器对 Wasm的支持越来越好,前端能玩的花样估计也会越来越多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/75364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux NUC小主机化身视频会议服务器: 技术优势与部署实战

在远程办公常态化背景下&#xff0c;视频会议系统对硬件的轻量化、低功耗与稳定性提出了更高要求。基于Intel NUC&#xff08;Next Unit of Computing&#xff09;打造的Linux服务器方案&#xff0c;凭借其高性能、低能耗和可扩展性优势&#xff0c;正成为中小企业搭建视频会议…

idea查看class字节码

概述 如何查看class字节码&#xff1f;话不多说&#xff0c;直接看示例&#xff01; 方法一 选中class类&#xff0c;然后选择 View -> Show Bytecode 方法二 安装jclasslib插件 方法三 Settings -> Tools -> External Tools 添加一个tool //指定javap.exe路…

python使用cookie、session、selenium实现网站登录(爬取信息)

一、使用cookie 这段代码演示了如何使用Python的urllib和http.cookiejar模块来实现网站的模拟登录&#xff0c;并在登录后访问需要认证的页面。 # 导入必要的库 import requests from urllib import request, parse# 1. 导入http.cookiejar模块中的CookieJar类&#xff0c;用…

机器人基础知识-1

1.六轴机器人中的六轴是什么&#xff1f; 第一轴&#xff08;J1&#xff09;&#xff1a;底座旋转 控制机器人整体绕垂直轴旋转&#xff08;左右摆动&#xff09;&#xff0c;决定工作范围的水平方向。 第二轴&#xff08;J2&#xff09;&#xff1a;下臂前后摆动 驱动机器人的…

将代理连接到 Elasticsearch 使用模型上下文协议

作者&#xff1a;来自 Elastic Jedr Blaszyk 及 Joe McElroy 让我们使用 Model Context Protocol 服务器 与 你的 数据 在 Elasticsearch 中聊天。 如果与你的数据交互像与同事聊天一样轻松&#xff0c;会怎样&#xff1f;想象一下&#xff0c;你只需简单地问&#xff1a;“显…

Vue 组件 - 动态组件

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue 组件 - 动态组件 目录 动态组件 选项卡页面示例 更简单写法 增加输入框 弥补措施 总结 动态组件 选项卡页面示例 功能&#xff1a;选项卡功能&#xff0c;设置导航点击哪个显示相应页面。 设置三个全局组件&#…

Telnet协议详解:本质与操作逻辑

一、Telnet的本质 1. 协议定位 Telnet是一种基于TCP的明文远程终端控制协议&#xff0c;属于应用层协议。其核心功能是通过网络模拟物理终端&#xff0c;实现对远程主机的命令行控制。 2. 核心特性 网络虚拟终端&#xff08;NVT&#xff09;&#xff1a;建立统一的字符编码标…

Android 使用CameraX实现预览、拍照、录制视频(Java版)

Android 官方关于相机的介绍如下&#xff1a; https://developer.android.google.cn/media/camera/get-started-with-camera?hlzh_cn 一、开始使用 Android 相机 Android相机一般包含前置摄像头和后置摄像头&#xff0c;使用相机可以开发一系列激动人心的应用&#xff0c;例…

面向对象

一、Scala包 1、基本语法 package 包名 2、Scala 包的三大作用&#xff08;和 Java 一样&#xff09; &#xff08;1&#xff09;区分相同名字的类 &#xff08;2&#xff09;当类很多时&#xff0c;可以很好的管理类 &#xff08;3&#xff09;控制访问范围 二、包说明 1、说明…

MySQL多表联查

一、数据库表结构 假设我们有两个表&#xff1a;users 和 orders&#xff0c;users 表存储用户信息&#xff0c;orders 表存储订单信息&#xff0c;一个用户可以有多个订单&#xff0c;通过 user_id 关联两个表。 users 表 字段名数据类型描述user_idINT用户 ID&#xff0c;…

如何迁移AxureCloud到新服务器?

前言 常有朋友遇到在更换服务器时或者本地AxureCloud迁移到服务器上时&#xff0c;如何正确迁移AxureCloud&#xff0c;让原有的原型可以正常访问呢&#xff1f; 事前准备 Navicat&#xff1a;用于迁移数据库。 AxureCloud&#xff1a;和原安装版本一致。 MySQL&#xff1…

CSGO 皮肤交易平台后端 (Spring Boot) 代码结构与示例

csgo-market/ ├── pom.xml (or build.gradle) └── src/└── main/├── java/│ └── com/│ └── yourcompany/│ └── csgomarket/│ ├── CsgomarketApplication.java # Spring Boot 启动类│ ├── conf…

mac Python多版本第三方库的安装路径

终端查看python版本是 3.12&#xff0c;但是pycharm使用的python版本是 3.9 终端正常安装包以后&#xff0c;pycharm都可以正常使用&#xff0c;但是将 pycharm的python换成 3.12 版本&#xff0c;之前安装的库都没有了 通过终端查看安装库的位置&#xff0c;确实是安装到py…

Java常用异步方式总结

使用建议 完整代码见https://gitee.com/pinetree-cpu/parent-demon 提供了postMan调试json文件于security-demo/src/main/resources/test_file/java-async.postman_collection.json 可导入postMan中进行调试 Java异步方式以及使用场景 继承Thread类 新建三个类继承Thread&…

【VUE3】Pinia

目录 0前言 1 手动添加Pinia 2 创建与使用仓库&#xff08;Setup Store 组合式&#xff09; 2.1 创建仓库 2.2 使用仓库数据 2.3 解构响应式数据 3 持久化插件 0前言 官网&#xff1a;Pinia | The intuitive store for Vue.js 1 手动添加Pinia 上手之后&#xff0c;可…

JVM 每个区域分别存储什么数据?

JVM&#xff08;Java Virtual Machine&#xff09;的运行时数据区&#xff08;Runtime Data Areas&#xff09;被划分为几个不同的区域&#xff0c;每个区域都有其特定的用途和存储的数据类型。以下是 JVM 各个区域存储数据的详细说明&#xff1a; 1. 程序计数器 (Program Cou…

C++中shared_ptr 是线程安全的吗?

在 C 中&#xff0c;shared_ptr 的线程安全性和实现原理可以通过以下方式通俗理解&#xff1a; 1. shared_ptr 是线程安全的吗&#xff1f; 答案&#xff1a;部分安全&#xff0c;需分场景&#xff01; 安全的操作&#xff1a; 引用计数的增减&#xff1a;多个线程同时复制或销…

什么是 CSSD?

文章目录 一、什么是 CSSD&#xff1f;CSSD 的职责 二、CSSD 是如何工作的&#xff1f;三、CSSD 为什么会重启节点&#xff1f;情况一&#xff1a;网络和存储都断联&#xff08;失联&#xff09;情况二&#xff1a;收到其他节点对自己的踢出通知&#xff08;外部 fencing&#…

arm64平台下linux访问寄存器

通用寄存器 示例&#xff1a;读取寄存器值 // 用户态程序或内核代码中均可使用 unsigned long reg_value; asm volatile ("mov %0, x10" // 将X10的值保存到reg_value变量: "r" (reg_value) ); printk("X10 0x%lx\n", reg_value);示例&…

超级好用的小软件,连接电脑和手机。

将手机变成电脑摄像头的高效工具Iriun Webcam是一款多平台软件&#xff0c;能够将手机摄像头变成电脑的摄像头&#xff0c;通过简单的设置即可实现视频会议、直播、录制等功能。它支持Windows、Mac和Linux系统&#xff0c;同时兼容iOS和Android手机&#xff0c;操作简单&#x…