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");
}

安全最佳实践

  1. 始终使用足够强度的密钥(如AES-256)
  2. 对于密码存储,使用专门的密码哈希函数如Argon2
  3. 不要重复使用初始化向量(IV)
  4. 定期轮换加密密钥
  5. 正确处理敏感数据(及时清零内存)

性能优化技巧

  1. 对于大量数据加密,使用流式处理
  2. 考虑使用硬件加速指令(AES-NI等)
  3. 重用加密上下文对象而不是频繁创建
  4. 对于性能敏感场景,考虑使用更快的算法如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库的主要功能,包括:

  1. 使用AES-256进行对称加密和解密
  2. 使用RSA进行非对称加密和解密
  3. 使用Ed25519进行数字签名和验证
  4. 使用SHA-256计算哈希值
  5. 使用Argon2进行安全的密码哈希存储和验证

要运行这个示例,只需将代码保存为main.rs文件,并在Cargo.toml中添加salty依赖即可。

回到顶部