Rust加密库tor-hscrypto的使用:专注于隐私保护与高性能加密算法的Tor网络组件
tor-hscrypto
tor-hscrypto
: 洋葱服务使用的基本加密操作
概述
这个crate是Arti项目的一部分,Arti是一个用Rust实现Tor的项目。
洋葱服务和连接它们的客户端需要一些Tor其他部分不使用的加密操作。这些包括:
- 一组密钥盲化操作,用于从长期公钥派生短期公钥
- 一个基于SHA3的临时消息认证码
- 将公钥编码和解码为
.onion
地址的操作 - 一组将时间划分为不同"周期"的操作。这些周期用作DHT-style哈希环和密钥盲化操作的输入
- 用于抵抗拒绝服务攻击的工作量证明方案
这个crate实现了这些操作,以及一组包装类型来帮助我们区分用于洋葱服务的众多密钥和nonce。
编译时特性
memquota-memcost
– 为许多类型实现tor_memquota::HasMemoryCost
。(实际上不会强制编译内存配额跟踪;那是tor-memquota
和更高级crate中的memquota
)ope
– 支持顺序保持加密(Order Preserving Encryption)full
– 启用上述所有特性
实验性和不稳定特性
请注意,这些特性启用的API不受语义版本控制保障:我们可能在补丁版本之间破坏或移除它们。
hs-pow-full
– Tor隐藏服务的工作量证明experimental
: 启用所有上述实验性特性
许可证
MIT OR Apache-2.0
当使用pow
特性时,我们会链接LGPL许可的依赖项。
示例代码
use tor_hscrypto::{Blinding, Subcredential, TimePeriod, OnionAddress};
// 生成长期身份密钥
let identity_key = x25519_dalek::StaticSecret::new(rand::thread_rng());
let identity_public = x25519_dalek::PublicKey::from(&identity_key);
// 创建时间周期
let now = SystemTime::now();
let period = TimePeriod::new(now, 24 * 60 * 60).unwrap(); // 24小时周期
// 生成子凭证
let subcredential = Subcredential::derive(&identity_key, &period);
// 盲化公钥
let blinded_key = Blinding::blind_pubkey(&identity_public, &period).unwrap();
// 生成.onion地址
let onion_address = OnionAddress::from_public(&blinded_key);
println!("Onion service address: {}", onion_address);
完整示例Demo
use tor_hscrypto::{Blinding, Subcredential, TimePeriod, OnionAddress};
use x25519_dalek::{StaticSecret, PublicKey};
use std::time::SystemTime;
fn main() {
// 1. 生成身份密钥对
let identity_secret = StaticSecret::new(rand::thread_rng());
let identity_public = PublicKey::from(&identity_secret);
// 2. 设置时间周期 (例如24小时)
let now = SystemTime::now();
let period = TimePeriod::new(now, 24 * 60 * 60).expect("Failed to create time period");
// 3. 派生子凭证
let subcredential = Subcredential::derive(&identity_secret, &period);
// 4. 盲化公钥
let blinded_key = Blinding::blind_pubkey(&identity_public, &period)
.expect("Failed to blind public key");
// 5. 生成.onion地址
let onion_address = OnionAddress::from_public(&blinded_key);
println!("Onion Service Setup:");
println!("- Period: {}", period);
println!("- Identity Public Key: {:?}", identity_public.as_bytes());
println!("- Blinded Public Key: {:?}", blinded_key.as_bytes());
println!("- Onion Address: {}", onion_address);
// 6. 验证周期
assert!(period.contains(&now), "Current time should be within the period");
// 7. 演示重新计算子凭证
let subcredential2 = Subcredential::derive(&identity_secret, &period);
assert_eq!(subcredential, subcredential2, "Subcredentials should match for same period");
}
这个示例展示了如何使用tor-hscrypto创建一个洋葱服务的基本设置,包括:
- 生成身份密钥
- 设置时间周期
- 派生子凭证
- 盲化公钥
- 生成.onion地址
- 验证周期有效性
- 验证子凭证的一致性
1 回复
Rust加密库tor-hscrypto的使用:专注于隐私保护与高性能加密算法的Tor网络组件
介绍
tor-hscrypto是Tor网络中的一个高性能加密组件,专门为隐私保护和安全通信设计。它实现了Tor协议中使用的各种加密原语和算法,包括:
- 分层加密(用于洋葱路由)
- 高性能的Diffie-Hellman密钥交换
- 各种哈希和对称加密算法
- 防篡改的数据格式处理
这个库是Tor项目的一部分,但也可以独立使用,适合需要高级隐私保护功能的Rust应用程序。
安装
在Cargo.toml中添加依赖:
[dependencies]
tor-hscrypto = "0.3"
基本使用方法
1. 创建和验证洋葱服务描述符
use tor_hscrypto::{pk::HsIdKey, time::Period, HsBlindIdKey};
// 生成长期身份密钥
let id_key = HsIdKey::generate();
// 生成盲化密钥(基于当前时间段)
let period = Period::current()?;
let blind_key = HsBlindIdKey::from_id_key(&id_key, period);
// 验证密钥
assert!(blind_key.valid_for_id_key(&id_key, period));
2. 分层加密(Onion加密)
use tor_hscrypto::layers::{OnionPublicKey, OnionSecretKey};
// 生成密钥对
let secret_key = OnionSecretKey::generate();
let public_key = OnionPublicKey::from(&secret_key);
// 加密数据
let plaintext = b"secret message";
let ciphertext = public_key.encrypt(plaintext)?;
// 解密数据
let decrypted = secret_key.decrypt(&ciphertext)?;
assert_eq!(plaintext, &decrypted[..]);
3. Diffie-Hellman密钥交换
use tor_hscrypto::dhe::{EphemeralSecret, PublicKey};
// 双方各生成密钥对
let alice_secret = EphemeralSecret::new();
let bob_secret = EphemeralSecret::new();
let alice_public = PublicKey::from(&alice_secret);
let bob_public = PublicKey::from(&bob_secret);
// 计算共享密钥
let alice_shared = alice_secret.diffie_hellman(&bob_public);
let bob_shared = bob_secret.diffie_hellman(&alice_public);
// 双方得到的共享密钥应该相同
assert_eq!(alice_shared.as_bytes(), bob_shared.as_bytes());
4. 创建和验证签名
use tor_hscrypto::pk::{Ed25519Keypair, Ed25519Signature};
// 生成密钥对
let keypair = Ed25519Keypair::generate();
// 签名数据
let message = b"important data";
let signature = keypair.sign(message);
// 验证签名
assert!(keypair.verify(&signature, message).is_ok());
高级功能
子凭证系统
use tor_hscrypto::subcredential::{Subcredential, HsIdKey};
// 主凭证
let id_key = HsIdKey::generate();
// 生成子凭证
let subcredential = Subcredential::derive(&id_key, b"extra context");
// 验证子凭证
assert!(subcredential.verify(&id_key, b"extra context"));
防篡改的数据格式
use tor_hscrypto::ll::pk::{HsSvcNtorKey, HsSvcNtorKeypair};
// 生成服务密钥对
let keypair = HsSvcNtorKeypair::generate();
// 编码为防篡改格式
let encoded = keypair.private.to_encoded();
// 解码并验证
let decoded = HsSvcNtorKey::from_encoded(&encoded)?;
assert_eq!(decoded.to_public(), keypair.public);
性能提示
- 重用密钥对象而不是重复生成
- 对大批量数据使用流式加密
- 考虑使用
rayon
并行处理加密操作
安全注意事项
- 妥善保管私钥
- 定期轮换密钥
- 使用最新的库版本
- 在生产环境中启用所有安全特性
tor-hscrypto为Tor网络提供了强大的加密基础,同时也适用于需要高级隐私保护的应用程序。通过正确使用这个库,开发者可以构建安全、隐私保护的通信系统。
完整示例代码
下面是一个整合了上述功能的完整示例:
use tor_hscrypto::{
dhe::{EphemeralSecret, PublicKey},
layers::{OnionPublicKey, OnionSecretKey},
pk::{Ed25519Keypair, HsIdKey},
subcredential::Subcredential,
time::Period,
HsBlindIdKey
};
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 1. 创建和验证洋葱服务描述符
let id_key = HsIdKey::generate();
let period = Period::current()?;
let blind_key = HsBlindIdKey::from_id_key(&id_key, period);
assert!(blind_key.valid_for_id_key(&id_key, period));
// 2. 分层加密
let secret_key = OnionSecretKey::generate();
let public_key = OnionPublicKey::from(&secret_key);
let plaintext = b"secret message";
let ciphertext = public_key.encrypt(plaintext)?;
let decrypted = secret_key.decrypt(&ciphertext)?;
assert_eq!(plaintext, &decrypted[..]);
// 3. Diffie-Hellman密钥交换
let alice_secret = EphemeralSecret::new();
let bob_secret = EphemeralSecret::new();
let alice_public = PublicKey::from(&alice_secret);
let bob_public = PublicKey::from(&bob_secret);
let alice_shared = alice_secret.diffie_hellman(&bob_public);
let bob_shared = bob_secret.diffie_hellman(&alice_public);
assert_eq!(alice_shared.as_bytes(), bob_shared.as_bytes());
// 4. 创建和验证签名
let keypair = Ed25519Keypair::generate();
let message = b"important data";
let signature = keypair.sign(message);
assert!(keypair.verify(&signature, message).is_ok());
// 5. 子凭证系统
let subcredential = Subcredential::derive(&id_key, b"extra context");
assert!(subcredential.verify(&id_key, b"extra context"));
Ok(())
}
这个完整示例展示了tor-hscrypto库的主要功能,包括洋葱服务描述符、分层加密、密钥交换、数字签名和子凭证系统。