39个版本 (10个重大更新)
0.11.7 | 2020年11月21日 |
---|---|
0.10.5 | 2020年11月10日 |
#2060 在 密码学
每月 36次下载
66KB
1.5K SLoC
Vented
Vented是一个基于事件异步TCP服务器,使用消息包作为有效载荷数据进行加密。
加密
Vented使用密钥加密来加密客户端和服务器之间的连接。双方的真实性通过双方事先需要知道的全局公钥进行验证。加密本身使用随机生成的密钥和与消息编号相对应的nonce。用于加密的crate是crypto_box,它使用XChaCha20Poly1305加密。用于密钥交换的crate是x25519-dalek。
用法
use vented::server::VentedServer;
use vented::server::data::{Node, ServerTimeouts};
use vented::stream::SecretKey;
use rand::thread_rng;
use vented::event::Event;
fn main() {
let global_secret_b = SecretKey::generate(&mut thread_rng());
let nodes = vec![
Node {
id: "B".to_string(),
addresses: vec![],
trusted: true,
public_key: global_secret_b.public_key() // load it from somewhere
},
];
// in a real world example the secret key needs to be loaded from somewhere because connections
// with unknown keys are not accepted.
let global_secret = SecretKey::generate(&mut thread_rng());
let mut server = VentedServer::new("A".to_string(), global_secret, nodes.clone(), ServerTimeouts::default());
server.listen("localhost:20000".to_string());
server.on("pong", |_event| {
Box::pin(async {println!("Pong!");
None
})
});
assert!(async_std::task::block_on(server.emit("B", Event::new("ping".to_string()))).is_err()) // this won't work without a known node B
}
}
依赖
~9–23MB
~300K SLoC