Skip to content

Latest commit

 

History

History
173 lines (97 loc) · 4.12 KB

README-CN.md

File metadata and controls

173 lines (97 loc) · 4.12 KB

@originjs/crypto-js-wasm

Build Status Version

English | 中文


crypto-js-wasm 是基于 JavaScript 和 WebAssembly 的哈希与加密算法库,其灵感来自于crypto-js

  • 安全: 得益于 WebAssembly ,crypto-js-wasm的计算过程是不可见、不可中断
  • 高效: 相比于crypto-js,计算效率最高提升了16倍(见 Benchmark)
  • 兼容crypto-js: 与crypto-js的API完全相同
  • 浏览器 & Nodejs: 同时支持 浏览器nodejs
  • 全能: 支持15+ 以上的哈希和加密算法,包括常用的 MD5、 SHA-x、 AES、RC4等
  • ESM: 基于ESM语法编写,编译为UMD以保证兼容性

最新消息

当前已经支持RSA和TypeScript!

安装

npm install @originjs/crypto-js-wasm

pnpm install @originjs/crypto-js-wasm

yarn add @originjs/crypto-js-wasm

使用

在使用各算法前需调用一次对应的loadWasm(),或调用loadAllWasm()以加载所有算法的WebAssembly文件。

import CryptoJSW from '@originjs/crypto-js-wasm';

// (可选) 加载所有 wasm 文件
await CryptoJSW.loadAllWasm();

// 通过 Async/Await 语法调用
await CryptoJSW.MD5.loadWasm();
const rstMD5 = CryptoJSW.MD5('message').toString();
console.log(rstMD5);

// 通过 Promise 语法调用
CryptoJSW.SHA256.loadWasm().then(() => {
    const rstSHA256 = CryptoJSW.SHA256('message').toString();
    console.log(rstSHA256);
})

需要注意的是,HMAC 没有loadWasm,因为如果要使用HMAC,必须指定哈希(例如HmacSHA1)。

同时, pbkdf2 中的 loadWasm 实现是调用了 SHA1.loadWasm ,这是因为 SHA1pbkdf2 的默认哈希算法。 如果指定了另一个哈希算法,则应分别调用该哈希算法对应的 loadWasmevpkdf/MD5 的情况与之类似, MD5evpkdf 的默认哈希算法。

RSA使用说明

请参考这篇文档.

目前可用的算法

  • MD5 / HmacMD5
  • SHA1 / HmacSHA1
  • SHA224 / HmacSHA224
  • SHA256 / HmacSHA256
  • SHA384 / HmacSHA384
  • SHA512 / HmacSHA512
  • SHA3 / HmacSHA3
  • RIPEMD160 / HmacRIPEMD160
  • PBKDF2
  • EvpKDF

  • AES

  • Blowfish

  • DES

  • TripleDES

  • Rabbit

  • RabbitLegacy

  • RC4

  • RC4Drop

  • RSA

Benchmark

以下 benchmark 结果运行自一台台式机 (i5-4590, 16 GB RAM, Windows 10 Version 21H2 (OSBuild 19044, 1466))。

Chrome 102.0.5005.63:

benchmark_chrome

Firefox 101.0:

benchmark_firefox

Nodejs v16.6.4:

nodejs

RSA(vs jsencrypt) in Chrome:

rsa_chrome

开发

# 安装依赖
pnpm install

# 生产构建
pnpm run build

# 运行所有测试
pnpm run test

#  运行所有测试并生成测试覆盖率报告
pnpm run coverage

为何我们需要调用异步的 loadWasm?

这是因为 WebAssembly 二进制需要通过 WebAssembly.instantiate 加载,并且这是一个异步函数。

WebAssembly.instantiate 与它的同步实现 WebAssembly.instance 相比,前者更受推荐;并且,在许多场景下,WebAssembly.instance 无法加载不够小的 WebAssembly 二进制。

为何我们需要以base64编码字符的方式,存储wasm二进制?

因为 crypto-js-wasm 需要同时支持 browsernodejs 两种使用场景。相比与 browser 中的 wasm loader (多数情况下由 webpack, vite 或其他框架提供)以及 nodejs 中的 fs 方式,这种wasm二进制存储方式是一种相对优雅的方式。

版权说明

该项目遵守木兰宽松许可证