Rust的Tor密钥生成库tor-key-forge的使用,安全生成和管理Tor网络密钥的高效工具

Rust的Tor密钥生成库tor-key-forge的使用,安全生成和管理Tor网络密钥的高效工具

tor-keys概述

tor-keys crate管理所有围绕tor-llcrypto中底层加密原语的高级封装。这些封装为底层加密密钥带来了语义层面的抽象,帮助避免在代码中混用不同类型的密钥。

例如,定义一个围绕底层ed25519密钥对的长期身份中继签名密钥对,可以确保该密钥不会被用于其他用途。

安装

在项目目录中运行以下Cargo命令:

cargo add tor-key-forge

或者在Cargo.toml中添加以下行:

tor-key-forge = "0.32.0"

完整示例代码

以下是使用tor-key-forge生成和管理Tor网络密钥的增强示例:

use tor_key_forge::{
    ed25519,
    relay::{RelayIdKeypair, RelayIdPublicKey},
    Error,
};

// 生成并管理Tor中继密钥的完整示例
fn manage_tor_keys() -> Result<(), Error> {
    // 1. 生成新的ed25519密钥对
    let keypair = ed25519::Keypair::generate();
    println!("原始密钥对已生成");

    // 2. 转换为中继身份密钥对
    let relay_id_keypair = RelayIdKeypair::from(keypair);
    println!("已转换为中继身份密钥对");

    // 3. 获取并打印公钥指纹
    let public_key = relay_id_keypair.public();
    println!("公钥指纹: {:x?}", public_key.fingerprint());

    // 4. 序列化密钥对
    let priv_key_bytes = relay_id_keypair.to_bytes();
    let pub_key_bytes = public_key.to_bytes();
    println!("私钥序列化完成 ({}字节)", priv_key_bytes.len());
    println!("公钥序列化完成 ({}字节)", pub_key_bytes.len());

    // 5. 保存到文件(实际应用中应该加密存储)
    std::fs::write("private.key", &priv_key_bytes)?;
    std::fs::write("public.key", &pub_key_bytes)?;
    println!("密钥已保存到文件");

    // 6. 从文件加载密钥
    let loaded_priv = std::fs::read("private.key")?;
    let loaded_pub = std::fs::read("public.key")?;
    println!("密钥已从文件加载");

    // 7. 反序列化密钥
    let restored_keypair = RelayIdKeypair::from_bytes(&loaded_priv)?;
    let restored_public = RelayIdPublicKey::from_bytes(&loaded_pub)?;
    println!("密钥已反序列化");

    // 8. 验证密钥
    assert_eq!(restored_keypair.public(), restored_public);
    println!("密钥验证成功");

    // 9. 演示签名验证
    let message = b"Tor网络安全消息";
    let signature = restored_keypair.sign(message);
    let verify_result = restored_public.verify(message, &signature);
    
    println!("签名验证结果: {}", verify_result.is_ok());

    Ok(())
}

fn main() {
    if let Err(e) = manage_tor_keys() {
        eprintln!("密钥管理出错: {}", e);
    }
}

密钥安全

tor-key-forge提供了类型安全的密钥封装,确保:

  1. 不同类型的密钥不会被混用
  2. 密钥只能用于其设计目的
  3. 提供了安全的序列化和反序列化方法
  4. 防止密钥误用和不当操作

许可证

本库采用MIT OR Apache-2.0双重许可。

维护者

该库由Tor项目的核心团队维护,主要贡献者包括:

  • Gabi Moldovan
  • Ian Jackson
  • Nick Mathewson
  • David Goulet

1 回复

Rust的Tor密钥生成库tor-key-forge使用指南

介绍

tor-key-forge是一个用于安全生成和管理Tor网络密钥的Rust库。它为Tor网络提供了一套完整的密钥生成和管理解决方案,包括:

  • 生成符合Tor规范的Ed25519和RSA密钥对
  • 安全地存储和管理密钥材料
  • 生成Tor的洋葱服务描述符
  • 支持密钥轮换和过期管理

这个库特别适合需要与Tor网络交互或创建Tor隐藏服务的Rust应用程序。

安装

在Cargo.toml中添加依赖:

[dependencies]
tor-key-forge = "0.3"

基本使用方法

1. 生成Ed25519密钥对

use tor_key_forge::ed25519::Keypair;

fn main() {
    // 生成新的Ed25519密钥对
    let keypair = Keypair::generate();
    
    println!("Public key: {:?}", keypair.public);
    println!("Private key: {:?}", keypair.private);
}

2. 生成RSA密钥对

use tor_key_forge::rsa::{RSAKeypair, RSAKeySize};

fn main() {
    // 生成1024位的RSA密钥对(Tor标准)
    let keypair = RSAKeypair::generate(RSAKeySize::RSA1024).unwrap();
    
    println!("RSA Public key: {:?}", keypair.public_key());
    println!("RSA Private key: {:?}", keypair.private_key());
}

3. 创建Tor隐藏服务描述符

use tor_key_forge::{HiddenServiceDescriptor, OnionAddress};

fn main() {
    // 生成Ed25519密钥对
    let keypair = tor_key_forge::ed25519::Keypair::generate();
    
    // 创建隐藏服务描述符
    let descriptor = HiddenServiceDescriptor::new(
        OnionAddress::from_public_key(&keypair.public),
        keypair,
        vec!["80 127.0.0.1:8080".parse().unwrap()], // 端口映射
    );
    
    println!("Descriptor: {}", descriptor.to_string());
}

高级功能

1. 密钥持久化存储

use tor_key forge::{KeyStorage, FileKeyStorage};
use std::path::Path;

fn main() -> std::io::Result<()> {
    let storage = FileKeyStorage::new(Path::new("tor_keys"));
    
    // 生成并存储密钥
    let keypair = tor_key_forge::ed25519::Keypair::generate();
    storage.store("my_service", &keypair)?;
    
    // 从存储中加载密钥
    let loaded = storage.load::<tor_key_forge::ed25519::Keypair>("my_service")?;
    
    Ok(())
}

2. 密钥轮换

use tor_key_forge::{KeyRotation, ed25519::Keypair};
use std::time::{Duration, SystemTime};

fn main() {
    let mut rotation = KeyRotation::new(
        Keypair::generate(), // 当前密钥
        Keypair::generate(), // 下一个密钥
        SystemTime::now() + Duration::from_secs(30 * 24 * 3600), // 30天后过期
    );
    
    // 检查是否需要轮换密钥
    if rotation.should_rotate() {
        rotation.rotate();
        println!("Key rotated successfully!");
    }
}

安全注意事项

  1. 始终确保私钥存储在安全的位置
  2. 定期轮换密钥以提高安全性
  3. 在生产环境中使用硬件安全模块(HSM)存储密钥
  4. 避免将密钥记录到日志文件中

完整示例:创建并管理Tor隐藏服务

use tor_key_forge::{
    ed25519::Keypair,
    HiddenServiceDescriptor,
    OnionAddress,
    KeyStorage,
    FileKeyStorage,
    KeyRotation
};
use std::path::Path;
use std::time::{Duration, SystemTime};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 1. 初始化密钥存储
    let storage_path = Path::new("tor_keys");
    let storage = FileKeyStorage::new(storage_path);
    
    // 2. 加载或生成密钥对
    let service_name = "my_hidden_service";
    let keypair = if storage.exists(service_name) {
        println!("Loading existing keypair...");
        storage.load::<Keypair>(service_name)?
    } else {
        println!("Generating new keypair...");
        let kp = Keypair::generate();
        storage.store(service_name, &kp)?;
        kp
    };
    
    // 3. 设置密钥轮换
    let mut rotation = KeyRotation::new(
        keypair.clone(), // 当前密钥
        Keypair::generate(), // 新密钥
        SystemTime::now() + Duration::from_secs(30 * 24 * 3600), // 30天后过期
    );
    
    // 4. 创建隐藏服务描述符
    let descriptor = HiddenServiceDescriptor::new(
        OnionAddress::from_public_key(&keypair.public),
        keypair,
        vec![
            "80 127.0.0.1:8080".parse()?, // HTTP服务
            "22 127.0.0.1:2222".parse()?, // SSH服务
        ],
    );
    
    // 5. 保存描述符到文件
    let desc_path = "hs_desc";
    std::fs::write(desc_path, descriptor.to_string())?;
    println!("Hidden service descriptor saved to {}", desc_path);
    
    // 6. 检查并执行密钥轮换
    if rotation.should_rotate() {
        println!("Rotating keys...");
        rotation.rotate();
        storage.store(service_name, &rotation.current_key())?;
        println!("Key rotation completed successfully!");
    }
    
    Ok(())
}

这个完整示例演示了如何:

  1. 初始化密钥存储系统
  2. 安全地生成或加载已有的密钥对
  3. 设置密钥轮换机制
  4. 创建Tor隐藏服务描述符
  5. 保存描述符到文件
  6. 定期检查并执行密钥轮换

通过这个示例,您可以构建一个完整的Tor隐藏服务,并确保密钥管理的安全性。

回到顶部