Rust密钥管理库tor-keymgr的使用,tor-keymgr提供安全高效的密钥存储与加密功能

tor-keymgr

Rust密钥管理库tor-keymgr的使用,提供安全高效的密钥存储与加密功能。

概述

这个crate是Arti项目的一部分,旨在用Rust实现Tor网络。

可能发生变化

此crate暴露的API(即使没有keymgr功能)是新开发的,可能会快速变化。因此我们经常会进行semver-breaking changes(并相应更新crate版本)。

密钥存储

KeyMgr是一个或多个密钥存储的接口。密钥存储是实现了Keystore trait的类型。

提供的密钥存储实现包括:

  • ArtiNativeKeystore: 以OpenSSH格式存储密钥的磁盘存储。目前不支持有密码的密钥,未来会添加密码支持
  • CTorServiceKeystore (实验性): 提供对给定HiddenServiceDirectory目录下隐藏服务密钥的只读访问
  • CTorClientKeystore (实验性): 提供对给定ClientOnionAuthDir目录下客户端受限发现密钥的只读访问

未来计划支持基于HSM的密钥存储。

密钥标识符和密钥类型

Keystore API使用KeySpecifier和KeyType来识别特定密钥实例。

KeySpecifier标识一组等效密钥(每种不同的算法类型)。在ArtiNativeKeystore中,它用于确定密钥在密钥存储中的路径(不包括扩展名,扩展名由KeyType派生)。

KeyType表示密钥的类型(“keypair”, “public key”)和算法(“ed25519”, “x25519”)。KeyType::arti_extension指定了该类型密钥在ArtiNativeKeystore中存储时的文件扩展名。

功能标志

附加功能

  • keymgr – 构建完整密钥管理器支持。禁用此功能会导致tor-keymgr导出无操作的占位实现。

实验性和不稳定功能

注意这些功能启用的API不包含语义版本保证。

  • ctor-keystore – 构建C Tor密钥存储支持
  • ephemeral-keystore – 构建临时密钥存储支持
  • onion-service-cli-extra – 构建额外的密钥和状态管理命令行功能

示例代码

use tor_keymgr::{KeyMgr, ArtiNativeKeystore};
use tor_keymgr::key_specifier::{KeySpecifier, ArtiPath};
use tor_keymgr::key_type::KeyType;

// 创建密钥管理器
let keystore = ArtiNativeKeystore::from_path("/path/to/keystore")?;
let keymgr = KeyMgr::new(keystore);

// 定义密钥标识符
struct MyKeySpecifier;
impl KeySpecifier for MyKeySpecifier {
    fn arti_path(&self) -> ArtiPath {
        ArtiPath::new("example/key".into())?
    }
    
    fn ctor_path(&self) -> Option<CTorPath> {
        None
    }
}

// 生成并存储密钥
let key_spec = MyKeySpecifier;
let key_type = KeyType::Ed25519Keypair;
let key = generate_ed25519_key(); // 假设的密钥生成函数

keymgr.insert(&key_spec, key_type, key)?;

// 读取密钥
let retrieved_key = keymgr.get(&key_spec, key_type)?;

// 删除密钥
keymgr.remove(&key_spec, key_type)?;

完整示例代码

use tor_keymgr::{KeyMgr, ArtiNativeKeystore};
use tor_keymgr::key_specifier::{KeySpecifier, ArtiPath};
use tor_keymgr::key_type::KeyType;
use anyhow::Result;
use rand::rngs::OsRng;
use ed25519_dalek::{Keypair, SecretKey};

// 定义密钥标识符
struct MyKeySpecifier;
impl KeySpecifier for MyKeySpecifier {
    fn arti_path(&self) -> Result<ArtiPath> {
        ArtiPath::new("example/key".into())
    }
    
    fn ctor_path(&self) -> Option<CTorPath> {
        None
    }
}

// 生成Ed25519密钥对
fn generate_ed25519_key() -> Vec<u8> {
    let mut csprng = OsRng{};
    let keypair: Keypair = Keypair::generate(&mut csprng);
    keypair.to_bytes().to_vec()
}

fn main() -> Result<()> {
    // 创建密钥管理器
    let keystore = ArtiNativeKeystore::from_path("./keystore")?;
    let keymgr = KeyMgr::new(keystore);
    
    // 定义密钥标识符
    let key_spec = MyKeySpecifier;
    let key_type = KeyType::Ed25519Keypair;
    
    // 生成并存储密钥
    let key = generate_ed25519_key();
    keymgr.insert(&key_spec, key_type, key.clone())?;
    
    // 读取密钥
    let retrieved_key = keymgr.get::<Vec<u8>>(&key_spec, key_type)?;
    assert_eq!(retrieved_key, Some(key));
    
    // 删除密钥
    keymgr.remove(&key_spec, key_type)?;
    
    Ok(())
}

安装

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

cargo add tor-keymgr

或添加以下行到Cargo.toml:

tor-keymgr = "0.32.0"

许可证

MIT OR Apache-2.0


1 回复

Rust密钥管理库tor-keymgr的使用指南

tor-keymgr是Tor项目中的一个Rust库,专门用于安全高效的密钥存储与加密操作。它为Tor网络客户端和服务器提供了密钥管理的基础设施。

主要功能

  • 安全存储加密密钥
  • 提供密钥生成和轮换功能
  • 支持多种密钥类型和加密算法
  • 实现密钥的持久化存储
  • 提供密钥访问控制机制

基本使用方法

添加依赖

首先在Cargo.toml中添加依赖:

[dependencies]
tor-keymgr = "0.1"

创建密钥存储

use tor_keymgr::KeyMgr;

// 创建一个新的密钥管理器
let key_mgr = KeyMgr::new();

生成和存储密钥

use tor_keymgr::KeyType;

// 生成一个新的Ed25519密钥对
let key_type = KeyType::Ed25519Keypair;
let key_name = "my_key".to_string();

key_mgr.generate_and_store(key_type, &key_name)?;

检索密钥

// 检索之前存储的密钥
let retrieved_key = key_mgr.get(&key_name, key_type)?;

match retrieved_key {
    Some(key) => println!("找到密钥: {:?}", key),
    None => println!("未找到指定密钥"),
}

密钥轮换

// 轮换现有密钥
key_mgr.rotate(&key_name, key_type)?;

高级用法

自定义密钥存储后端

use tor_keymgr::{KeyMgr, KeyStore};

struct MyCustomKeyStore;

impl KeyStore for MyCustomKeyStore {
    // 实现必要的trait方法
}

let custom_store = MyCustomKeyStore;
let key_mgr = KeyMgr::with_store(Box::new(custom_store));

加密密钥材料

use tor_keymgr::EncryptedKey;

// 加密密钥
let plaintext_key = b"my_secret_key";
let encrypted = EncryptedKey::encrypt(plaintext_key, "strong_password")?;

// 解密密钥
let decrypted = encrypted.decrypt("strong_password")?;
assert_eq!(decrypted, plaintext_key);

安全注意事项

  1. 始终确保密钥存储位置的安全
  2. 定期轮换敏感密钥
  3. 不要将密钥硬编码在源代码中
  4. 使用强密码保护加密的密钥材料
  5. 在生产环境中实现适当的访问控制

完整示例演示

以下是内容中提供的示例代码:

use tor_keymgr::{KeyMgr, KeyType};

fn main() -> anyhow::Result<()> {
    // 初始化密钥管理器
    let key_mgr = KeyMgr::new();
    
    // 定义密钥名称和类型
    let key_name = "example_ed25519_key".to_string();
    let key_type = KeyType::Ed25519Keypair;
    
    // 生成并存储密钥
    key_mgr.generate_and_store(key_type, &key_name)?;
    
    // 检索并使用密钥
    if let Some(key) = key_mgr.get(&key_name, key_type)? {
        println!("成功获取密钥: {:?}", key);
        
        // 使用密钥进行加密/签名操作...
    }
    
    // 轮换密钥
    key_mgr.rotate(&key_name, key_type)?;
    
    // 删除密钥
    key_mgr.remove(&key_name, key_type)?;
    
    Ok(())
}

完整示例demo

下面是一个更完整的示例,展示了tor-keymgr库的完整使用流程:

use tor_keymgr::{KeyMgr, KeyType, EncryptedKey};
use anyhow::Result;

fn main() -> Result<()> {
    // 1. 初始化密钥管理器
    let key_mgr = KeyMgr::new();
    
    // 2. 定义密钥信息
    let key_name = "secure_communication_key".to_string();
    let key_type = KeyType::Ed25519Keypair;
    
    // 3. 生成并存储密钥
    println!("正在生成新密钥...");
    key_mgr.generate_and_store(key_type, &key_name)?;
    println!("密钥生成并存储成功");
    
    // 4. 检索密钥
    println!("尝试检索密钥...");
    match key_mgr.get(&key_name, key_type)? {
        Some(key) => {
            println!("成功检索到密钥");
            
            // 5. 演示加密密钥材料
            println!("加密密钥材料...");
            let encrypted = EncryptedKey::encrypt(b"secret_data", "my_strong_password")?;
            
            // 6. 演示解密
            let decrypted = encrypted.decrypt("my_strong_password")?;
            println!("解密成功: {:?}", decrypted);
        }
        None => println!("未找到密钥"),
    }
    
    // 7. 密钥轮换
    println!("轮换密钥...");
    key_mgr.rotate(&key_name, key_type)?;
    println!("密钥轮换完成");
    
    // 8. 删除密钥
    println!("删除密钥...");
    key_mgr.remove(&key_name, key_type)?;
    println!("密钥删除完成");
    
    Ok(())
}

这个完整示例展示了以下功能:

  1. 初始化密钥管理器
  2. 定义密钥名称和类型
  3. 生成并存储新密钥
  4. 检索现有密钥
  5. 使用EncryptedKey加密敏感数据
  6. 解密加密数据
  7. 轮换密钥
  8. 安全删除密钥

tor-keymgr为Tor网络应用提供了强大而灵活的密钥管理解决方案,通过合理使用可以显著提升应用的安全性。

回到顶部