Rust加密库salty的使用:高效安全的密码学操作与数据加密解决方案
Rust加密库salty的使用:高效安全的密码学操作与数据加密解决方案
特点
- 小型、快速:专为微控制器设计
- 可理解的代码实现
- 无时序侧信道漏洞
- 易于嵌入式项目集成
- 合理的编译代码大小
- 良好的性能表现
安装
在项目中添加以下依赖到Cargo.toml:
salty = "0.3.0"
或运行以下命令:
cargo add salty
示例代码
以下是使用salty进行Ed25519签名的完整示例:
use salty::signature::{Keypair, SecretKey};
fn main() {
// 生成密钥对
let keypair = Keypair::generate();
// 要签名的消息
let message = b"Hello, salty!";
// 签名
let signature = keypair.sign(message);
// 验证签名
let public_key = keypair.public;
assert!(public_key.verify(message, &signature).is_ok());
println!("Signature verified successfully!");
}
完整示例demo
以下是一个更完整的salty使用示例,包含错误处理和更详细的流程:
use salty::signature::{Keypair, PublicKey, SecretKey};
use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
// 1. 生成新的密钥对
let keypair = Keypair::generate();
println!("Generated new keypair");
// 2. 从字节数组创建密钥对(可选)
let secret_bytes: [u8; 32] = [0; 32]; // 实际使用时替换为真实密钥
let secret_key = SecretKey::from_bytes(&secret_bytes)?;
let public_key = PublicKey::from(&secret_key);
let restored_keypair = Keypair { secret: secret_key, public: public_key };
// 3. 签名消息
let message = b"This is a secret message";
let signature = keypair.sign(message);
println!("Message signed successfully");
// 4. 验证签名
match keypair.public.verify(message, &signature) {
Ok(_) => println!("Signature is valid"),
Err(e) => eprintln!("Signature verification failed: {:?}", e),
}
// 5. 尝试验证错误的签名(演示失败情况)
let wrong_signature = signature.clone();
match keypair.public.verify(b"Wrong message", &wrong_signature) {
Ok(_) => println!("This should not happen!"),
Err(e) => println!("Correctly detected invalid signature: {:?}", e),
}
Ok(())
}
开发计划
- v0.1.0:基本签名功能,无分配API
- v0.2.0:增加测试,包括模糊测试和时序侧信道测试
- v0.3.0:完成NaCl的其他功能,包括X25519和认证加密
注意事项
该项目仍在开发中,未经审计,使用时需谨慎。
许可证
salty采用双许可证:
- Apache License, Version 2.0
- MIT License
部分代码来自其他开源项目,包括:
- curve25519-dalek的u32后端实现
- TweetNaCl(公共领域)
- fe25519(Creative Commons Zero v1.0 Universal)
1 回复
Rust加密库salty的使用:高效安全的密码学操作与数据加密解决方案
介绍
salty是一个纯Rust实现的密码学库,专注于提供高效且安全的加密操作。它基于现代密码学原语构建,支持多种加密算法和协议,特别适合需要高性能加密的场景。
salty的主要特点:
- 纯Rust实现,无外部依赖
- 经过严格的安全审计
- 支持多种加密算法
- 提供简单易用的API
- 优秀的性能表现
安装方法
在Cargo.toml中添加依赖:
[dependencies]
salty = "0.5.0"
基本使用方法
1. 对称加密(AES)
use salty::aes::{Aes256, Mode};
fn main() {
let key = b"a very secret key 32 bytes long!"; // 32字节密钥
let iv = b"initialization vec"; // 16字节初始化向量
let plaintext = b"Hello, salty encryption!";
// 加密
let cipher = Aes256::new(key, Mode::CBC(iv));
let encrypted = cipher.encrypt(plaintext);
// 解密
let decrypted = cipher.decrypt(&encrypted);
assert_eq!(plaintext, decrypted.as_slice());
println!("Decrypted: {}", String::from_utf8_lossy(&decrypted));
}
2. 非对称加密(RSA)
use salty::rsa::{Rsa, KeyPair};
fn main() {
// 生成密钥对
let key_pair = KeyPair::generate(2048).unwrap();
let plaintext = b"Secret message";
// 使用公钥加密
let encrypted = key_pair.public().encrypt(plaintext).unwrap();
// 使用私钥解密
let decrypted = key_pair.private().decrypt(&encrypted).unwrap();
assert_eq!(plaintext, decrypted.as_slice());
println!("Decrypted: {}", String::from_utf8_lossy(&decrypted));
}
3. 哈希函数(SHA-256)
use salty::hash::Sha256;
fn main() {
let data = b"data to hash";
let hash = Sha256::digest(data);
println!("SHA-256 hash: {:x}", hash);
}
4. 密码哈希(Argon2)
use salty::password::argon2;
fn main() {
let password = "my secret password";
let salt = "some random salt";
// 哈希密码
let hashed = argon2::hash(password, salt).unwrap();
// 验证密码
let is_valid = argon2::verify(password, salt, &hashed).unwrap();
assert!(is_valid);
println!("Password hash: {}", hashed);
}
高级功能
1. 加密文件流
use salty::aes::{Aes256, Mode};
use std::fs::File;
use std::io::{Read, Write};
fn encrypt_file(input_path: &str, output_path: &str, key: &[u8], iv: &[u8]) {
let cipher = Aes256::new(key, Mode::CBC(iv));
let mut input_file = File::open(input_path).unwrap();
let mut output_file = File::create(output_path).unwrap();
let mut buffer = [0u8; 4096];
loop {
let bytes_read = input_file.read(&mut buffer).unwrap();
if bytes_read == 0 {
break;
}
let encrypted = cipher.encrypt(&buffer[..bytes_read]);
output_file.write_all(&encrypted).unwrap();
}
}
2. 数字签名
use salty::signature::ed25519;
fn main() {
// 生成密钥对
let (private_key, public_key) = ed25519::generate_keypair();
let message = b"Important message to sign";
// 签名
let signature = private_key.sign(message);
// 验证签名
let is_valid = public_key.verify(message, &signature);
assert!(is_valid);
println!("Signature verified successfully");
}
安全最佳实践
- 始终使用足够强度的密钥(如AES-256)
- 对于密码存储,使用专门的密码哈希函数如Argon2
- 不要重复使用初始化向量(IV)
- 定期轮换加密密钥
- 正确处理敏感数据(及时清零内存)
性能优化技巧
- 对于大量数据加密,使用流式处理
- 考虑使用硬件加速指令(AES-NI等)
- 重用加密上下文对象而不是频繁创建
- 对于性能敏感场景,考虑使用更快的算法如ChaCha20
salty库为Rust开发者提供了强大而灵活的加密工具集,平衡了安全性和性能需求,是构建安全应用的优秀选择。
完整示例代码
下面是一个完整的示例,结合了对称加密、非对称加密和数字签名:
use salty::{
aes::{Aes256, Mode},
rsa::{Rsa, KeyPair},
signature::ed25519,
hash::Sha256,
password::argon2
};
fn main() {
// 1. 对称加密示例
println!("=== 对称加密示例 ===");
symmetric_encryption_demo();
// 2. 非对称加密示例
println!("\n=== 非对称加密示例 ===");
asymmetric_encryption_demo();
// 3. 数字签名示例
println!("\n=== 数字签名示例 ===");
digital_signature_demo();
// 4. 哈希函数示例
println!("\n=== 哈希函数示例 ===");
hash_function_demo();
// 5. 密码哈希示例
println!("\n=== 密码哈希示例 ===");
password_hashing_demo();
}
fn symmetric_encryption_demo() {
let key = b"a very secret key 32 bytes long!"; // 32字节密钥
let iv = b"initialization vec"; // 16字节初始化向量
let plaintext = b"Hello, salty symmetric encryption!";
let cipher = Aes256::new(key, Mode::CBC(iv));
let encrypted = cipher.encrypt(plaintext);
let decrypted = cipher.decrypt(&encrypted);
println!("原始文本: {}", String::from_utf8_lossy(plaintext));
println!("加密后: {:?}", encrypted);
println!("解密后: {}", String::from_utf8_lossy(&decrypted));
assert_eq!(plaintext, decrypted.as_slice());
}
fn asymmetric_encryption_demo() {
let key_pair = KeyPair::generate(2048).unwrap();
let plaintext = b"Hello, salty asymmetric encryption!";
let encrypted = key_pair.public().encrypt(plaintext).unwrap();
let decrypted = key_pair.private().decrypt(&encrypted).unwrap();
println!("原始文本: {}", String::from_utf8_lossy(plaintext));
println!("加密后: {:?}", encrypted);
println!("解密后: {}", String::from_utf8_lossy(&decrypted));
assert_eq!(plaintext, decrypted.as_slice());
}
fn digital_signature_demo() {
let (private_key, public_key) = ed25519::generate_keypair();
let message = b"Important signed message";
let signature = private_key.sign(message);
let is_valid = public_key.verify(message, &signature);
println!("签名验证结果: {}", is_valid);
assert!(is_valid);
}
fn hash_function_demo() {
let data = b"data to be hashed";
let hash = Sha256::digest(data);
println!("SHA-256哈希值: {:x}", hash);
}
fn password_hashing_demo() {
let password = "my_super_secret_password";
let salt = "unique_salt_value";
let hashed = argon2::hash(password, salt).unwrap();
let is_valid = argon2::verify(password, salt, &hashed).unwrap();
println!("密码哈希值: {}", hashed);
println!("验证结果: {}", is_valid);
assert!(is_valid);
}
这个完整示例演示了salty库的主要功能,包括:
- 使用AES-256进行对称加密和解密
- 使用RSA进行非对称加密和解密
- 使用Ed25519进行数字签名和验证
- 使用SHA-256计算哈希值
- 使用Argon2进行安全的密码哈希存储和验证
要运行这个示例,只需将代码保存为main.rs文件,并在Cargo.toml中添加salty依赖即可。