Rust加密库rust-crypto-wasm的使用:支持WebAssembly的高性能密码学计算与安全哈希

Rust-Crypto

一个(大部分)纯Rust实现的各种常见加密算法。

Rust-Crypto旨在创建实用、可审计、纯Rust实现的常见加密算法,并在适当的地方使用最少量的汇编代码。支持x86-64、x86和ARM架构,尽管x86-64架构接受最多的测试。

Rust-Crypto针对当前稳定的Rust版本构建。如果您在使用旧版本时遇到问题,请尝试升级到最新的稳定版本。

Rust-Crypto尚未经过彻底的正确性审计,因此目前不建议在任何安全性重要的场景中使用。

使用方法

要使用Rust-Crypto,请将以下内容添加到您的Cargo.toml中:

[dependencies]
rust-crypto = "^0.2"

并将以下内容添加到您的crate根目录中:

extern crate crypto;

贡献

非常欢迎贡献。最重要的需求是帮助添加文档、实现新算法以及进行代码的一般清理和改进。通过提交拉取请求,您同意根据Rust-Crypto项目的许可条款使您的工作可用。

许可证

Rust-Crypto采用MIT和Apache 2.0双重许可,与Rust编译器相同的许可证。

算法

Rust-Crypto已经支持大量算法,并且在您的帮助下,未来将支持更多。当前支持的算法包括:

  • AES
  • Bcrypt
  • BLAKE2b
  • BLAKE2s
  • Blowfish
  • ChaCha20
  • Curve25519
  • ECB、CBC和CTR块密码模式
  • Ed25519
  • Fortuna
  • Ghash
  • HC128
  • HMAC
  • MD5
  • PBKDF2
  • CBC块密码模式的PKCS填充
  • Poly1305
  • RC4
  • RIPEMD-160
  • Salsa20和XSalsa20
  • Scrypt
  • Sha1
  • Sha2(所有固定输出大小变体)
  • Sha3
  • Sosemanuk
  • Whirlpool

内容中提供的示例:

[dependencies]
rust-crypto = "^0.2"
extern crate crypto;

完整示例demo:

extern crate crypto;

use crypto::digest::Digest;
use crypto::sha2::Sha256;

fn main() {
    // 创建一个SHA-256哈希器实例
    let mut hasher = Sha256::new();
    
    // 输入要哈希的数据
    let data = "Hello, World!";
    hasher.input_str(data);
    
    // 获取哈希结果
    let result = hasher.result_str();
    
    // 打印哈希值
    println!("SHA-256 hash of '{}': {}", data, result);
    
    // 重置哈希器以重用
    hasher.reset();
    
    // 哈希另一组数据
    let data2 = "Rust Crypto Library";
    hasher.input_str(data2);
    let result2 = hasher.result_str();
    println!("SHA-256 hash of '{}': {}", data2, result2);
}
extern crate crypto;

use crypto::aes::{cbc_encryptor, cbc_decryptor, KeySize};
use crypto::blockmodes::NoPadding;
use crypto::buffer::{RefReadBuffer, RefWriteBuffer, BufferResult};

fn main() {
    // 加密密钥和初始化向量
    let key = [0u8; 16]; // 128位密钥
    let iv = [0u8; 16];  // 初始化向量
    
    // 要加密的明文数据
    let plaintext = b"Hello, World!";
    
    // 加密
    let mut encryptor = cbc_encryptor(
        KeySize::KeySize128,
        &key,
        &iv,
        NoPadding
    );
    
    let mut encrypted = vec![0; plaintext.len() + 16];
    let mut read_buffer = RefReadBuffer::new(plaintext);
    let mut write_buffer = RefWriteBuffer::new(&mut encrypted);
    
    encryptor.encrypt(&mut read_buffer, &mut write_buffer, true).unwrap();
    
    // 解密
    let mut decryptor = cbc_decryptor(
        KeySize::KeySize128,
        &key,
        &iv,
        NoPadding
    );
    
    let mut decrypted = vec![0; encrypted.len()];
    let mut read_buffer = RefReadBuffer::new(&encrypted);
    let mut write_buffer = RefWriteBuffer::new(&mut decrypted);
    
    decryptor.decrypt(&mut read_buffer, &mut write_buffer, true).unwrap();
    
    println!("Original: {:?}", plaintext);
    println!("Decrypted: {:?}", &decrypted[..plaintext.len()]);
}

1 回复

Rust加密库rust-crypto-wasm的使用指南

概述

rust-crypto-wasm是一个专为WebAssembly环境设计的高性能密码学库,提供安全的加密算法和哈希函数实现。该库针对wasm32-unknown-unknown目标进行了优化,特别适合在浏览器和WebAssembly运行时环境中使用。

主要特性

  • 支持常见哈希算法(SHA-256、SHA-512等)
  • 提供对称加密算法(AES)
  • 包含消息认证码(HMAC)功能
  • 针对WebAssembly环境优化性能
  • 零依赖设计,确保代码安全性

安装方法

在Cargo.toml中添加依赖:

[dependencies]
rust-crypto-wasm = "0.3"

基本使用方法

1. 哈希计算示例

use rust_crypto_wasm::sha2::{Sha256, Digest};

fn main() {
    let mut hasher = Sha256::new();
    hasher.update(b"hello world");
    let result = hasher.finalize();
    println!("SHA-256哈希值: {:x}", result);
}

2. HMAC签名示例

use rust_crypto_wasm::hmac::{Hmac, Mac};
use rust_crypto_wasm::sha2::Sha256;

fn main() {
    let key = b"secret-key";
    let mut mac = Hmac::<Sha256>::new_from_slice(key).unwrap();
    mac.update(b"message to authenticate");
    let result = mac.finalize().into_bytes();
    println!("HMAC签名: {:x}", result);
}

3. AES加密示例

use rust_crypto_wasm::aes::{Aes256, cipher::{
    generic_array::GenericArray,
    BlockEncrypt, BlockDecrypt, KeyInit
}};

fn encrypt_decrypt() {
    let key = GenericArray::from([0u8; 32]);
    let mut block = GenericArray::from([0u8; 16]);
    
    let cipher = Aes256::new(&key);
    cipher.encrypt_block(&mut block);
    println!("加密后的块: {:?}", block);
    
    cipher.decrypt_block(&mut block);
    println!("解密后的块: {:?}", block);
}

WebAssembly集成示例

在wasm-bindgen项目中使用:

use wasm_bindgen::prelude::*;
use rust_crypto_wasm::sha2::{Sha256, Digest};

#[wasm_bindgen]
pub fn compute_hash(input: &[u8]) -> Vec<u8> {
    let mut hasher = Sha256::new();
    hasher.update(input);
    hasher.finalize().to_vec()
}

完整示例demo

以下是一个完整的示例,展示了rust-crypto-wasm库的主要功能:

use rust_crypto_wasm::sha2::{Sha256, Sha512, Digest};
use rust_crypto_wasm::hmac::{Hmac, Mac};
use rust_crypto_wasm::aes::{Aes256, cipher::{
    generic_array::GenericArray,
    BlockEncrypt, BlockDecrypt, KeyInit
}};

fn main() {
    // 示例1: SHA-256哈希计算
    println!("=== SHA-256哈希计算 ===");
    let mut sha256_hasher = Sha256::new();
    sha256_hasher.update(b"hello world");
    let sha256_result = sha256_hasher.finalize();
    println!("SHA-256哈希值: {:x}", sha256_result);

    // 示例2: SHA-512哈希计算
    println!("\n=== SHA-512哈希计算 ===");
    let mut sha512_hasher = Sha512::new();
    sha512_hasher.update(b"hello world");
    let sha512_result = sha512_hasher.finalize();
    println!("SHA-512哈希值: {:x}", sha512_result);

    // 示例3: HMAC签名
    println!("\n=== HMAC签名 ===");
    let key = b"my-secret-key-12345";
    let mut hmac = Hmac::<Sha256>::new_from_slice(key).unwrap();
    hmac.update(b"important message");
    let hmac_result = hmac.finalize().into_bytes();
    println!("HMAC签名: {:x}", hmac_result);

    // 示例4: AES加密解密
    println!("\n=== AES加密解密 ===");
    // 创建32字节的密钥(AES-256需要32字节密钥)
    let aes_key = GenericArray::from([
        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
        0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
        0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
        0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
    ]);
    
    // 创建16字节的数据块(AES块大小)
    let mut data_block = GenericArray::from([
        0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
        0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
    ]);

    println!("原始数据块: {:02x?}", data_block);

    let cipher = Aes256::new(&aes_key);
    
    // 加密
    cipher.encrypt_block(&mut data_block);
    println!("加密后的块: {:02x?}", data_block);
    
    // 解密
    cipher.decrypt_block(&mut data_block);
    println!("解密后的块: {:02x?}", data_block);
}

// WebAssembly集成函数示例
#[cfg(target_arch = "wasm32")]
use wasm_bindgen::prelude::*;

#[cfg(target_arch = "wasm32")]
#[wasm_bindgen]
pub struct CryptoUtils {
    hasher: Sha256,
}

#[cfg(target_arch = "wasm32")]
#[wasm_bindgen]
impl CryptoUtils {
    #[wasm_bindgen(constructor)]
    pub fn new() -> Self {
        CryptoUtils {
            hasher: Sha256::new()
        }
    }

    #[wasm_bindgen]
    pub fn update(&mut self, data: &[u8]) {
        self.hasher.update(data);
    }

    #[wasm_bindgen]
    pub fn finalize(&mut self) -> Vec<u8> {
        self.hasher.finalize_reset().to_vec()
    }

    #[wasm_bindgen]
    pub fn compute_hmac(key: &[u8], data: &[u8]) -> Vec<u8> {
        let mut hmac = Hmac::<Sha256>::new_from_slice(key).unwrap();
        hmac.update(data);
        hmac.finalize().into_bytes().to_vec()
    }
}

性能优化建议

  1. 重用哈希实例处理多个消息
  2. 预分配内存避免wasm内存频繁分配
  3. 使用固定大小的缓冲区处理数据

安全注意事项

  • 确保密钥的安全存储和管理
  • 使用适当的随机数生成器
  • 定期更新加密密钥
  • 验证输入数据的完整性

浏览器兼容性

支持所有现代浏览器,包括:

  • Chrome 57+
  • Firefox 53+
  • Safari 11+
  • Edge 16+

该库为WebAssembly环境提供了可靠的密码学基础功能,适合构建需要加密功能的Web应用和浏览器扩展。

回到顶部