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
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);
安全注意事项
- 始终确保密钥存储位置的安全
- 定期轮换敏感密钥
- 不要将密钥硬编码在源代码中
- 使用强密码保护加密的密钥材料
- 在生产环境中实现适当的访问控制
完整示例演示
以下是内容中提供的示例代码:
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(())
}
这个完整示例展示了以下功能:
- 初始化密钥管理器
- 定义密钥名称和类型
- 生成并存储新密钥
- 检索现有密钥
- 使用EncryptedKey加密敏感数据
- 解密加密数据
- 轮换密钥
- 安全删除密钥
tor-keymgr
为Tor网络应用提供了强大而灵活的密钥管理解决方案,通过合理使用可以显著提升应用的安全性。