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()]);
}
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()
}
}
性能优化建议
- 重用哈希实例处理多个消息
- 预分配内存避免wasm内存频繁分配
- 使用固定大小的缓冲区处理数据
安全注意事项
- 确保密钥的安全存储和管理
- 使用适当的随机数生成器
- 定期更新加密密钥
- 验证输入数据的完整性
浏览器兼容性
支持所有现代浏览器,包括:
- Chrome 57+
- Firefox 53+
- Safari 11+
- Edge 16+
该库为WebAssembly环境提供了可靠的密码学基础功能,适合构建需要加密功能的Web应用和浏览器扩展。