# 基于Rust的跨平台剪切板加密同步工具 **Repository Path**: gofaquan/pasteman ## Basic Information - **Project Name**: 基于Rust的跨平台剪切板加密同步工具 - **Description**: 文件部署文档存放处,供展示,源码在大赛文件中公开 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-05-02 - **Last Updated**: 2022-05-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Project-Intro 基于Rust的跨平台剪切板加密同步工具 注: 本项目参加了计算机设计大赛,所有权归大赛所有,故未展示源码,源码已提交至大赛作品文件夹中 ## 作品介绍 基于Rust语言编写的可移植多平台剪切板加密实时同步工具,本项目使用了WebSocket协议与Rust语言以实现跨平台设备上的实时剪切板信息同步功能,同时本项目基于Rust编写,具有快速、高并发、安全且具有授权性等特点,并且由于是偏向C的底层编程语言,具有良好的跨平台移植性。加上Rust本身编译器的规范性,对项目未来的维护埋下良好基础,代码更加容易理解和维护。 ## 开源组件说明 ### 服务端 * [Actix](https://github.com/actix/actix):本项目使用的小巧、灵活且强大的Rust语言`Web`框架 * [futures-rs](https://github.com/rust-lang/futures-rs) 与 [Tokio](https://github.com/tokio-rs/tokio):Rust相关的异步信息处理组件,优化了I/O拥堵相关性能 * [Nano ID](https://github.com/ai/nanoid):一个安全、URL友好的 JavaScript 字符串ID生成器,用于验证加密设备通信 * [env_logger](https://docs.rs/env_logger/latest/env_logger/):对项目运行时日志进行记录,方便排查问题 * [serde](https://serde.rs/):通过序列化与反序列化,使得项目本身代码简明易懂,便于集成使用 ### 客户端 在原本服务端已有的部分组件的基础上增加了 * [clipboard](https://crates.io/crates/clipboard-win):通过系统API读取系统剪切板,实现读取和写入操作 * [flate2](https://docs.rs/flate2/latest/flate2/):提供了数据压缩的功能,减小信息带宽占用 * [magic-crypt](https://crates.io/crates/magic-crypt):实现了对数据包的加密,让剪切板信息在传输的过程中安全也能得到保证 ## 安装说明 ### 编译 项目本身为可跨平台使用的服务组件,默认已经提供了在常见操作系统环境下的可执行文件进行测试,其他平台,如`ARM`等相关架构只需要配置按需要进行交叉编译即可获得对应的可执行文件,具体交叉编译的教程参考[Rust Cross-compilation](https://rust-lang.github.io/rustup/cross-compilation.html)即可 对于`Linux`环境,在安装了`mingw-w64-gcc`的基础上,使用以下指令进行交叉编译 ```bash cargo build --target=x86_64-pc-windows-gnu ``` ### Docker 编译 在配置了Docker的情况下,也可以使用以下命令使用[cross](https://github.com/cross-rs/cross)工具编译,不需要额外安装mingw-w64-gcc ```bash cargo install cross # 安装cross cross build --target x86_64-pc-windows-gnu # 编译 ``` ## 语法检查 在使用`vscode`的`rust-analyzer`插件时,如果采取`Linux`交叉编译的方法,需要在`.vscode/settings.json`文件增加以下参数修正语法检查 ```json { "rust-analyzer.checkOnSave.extraArgs": [ "--target=x86_64-pc-windows-gnu" ], } ``` ## 配置教程 ### 服务端配置 > 该说明以`Windows`平台为例,其他平台只需要进行相似的操作即可 1. 通过编译获得`Windows`平台下`server`的可执行文件,假设可执行文件名为`clipboard-sync-server.exe`。首次运行的时候会生成配置文件`config.toml`,内容如下 ```config bind_addr = "127.0.0.1:30341" allowed_group_ids = ["7fpw0mbXGI5Lp5k2PfwFc", "6PdUKBJcMISSkuFhF5dEW", "lwwrmzF9Fp1F_uBE2Uh0s"] ``` `bind_addr`对应为服务端开放服务的`IP:Port` `allowed_group_ids`对应允许的剪切板共享组,默认为三组 2. 配置好了`config.toml`后通过进程守护等方法再次运行服务端在服务器后台,等待`client`进行对接。 ### 客户端配置 1. 通过编译获得`Windows`平台下`client`的可执行文件,假设可执行文件名为`clipboard-sync-client.exe`。首次运行的时候会生成配置文件`config.toml`,内容如下 ```config server_url = "ws://127.0.0.1:30341/{your_id_here}" password = "" ``` 2. 将`127.0.0.1:30341`更改为对应`Server`的`IP:Port`,同时将`{your_id_here}`修改为`Server`中生成的`UUID`。同时在`password`后填入密码即可对剪切板内容进行加密传输 3. 在要同步的另外一个设备进行相同的操作,并保证`config.toml`的内容一致 4. 再次运行`clipboard-sync-client.exe`即可成功连接,并开启同步。 ## 作品效果图 ### 服务端初始化 ![server_init](/img/server_init.png) ### 客户端初始化 ![client_init](/img/client_init.png) ### 客户端和服务端对接 ![server_client_connect](/img/client_running.png) ### 服务端后台 ![server_running](/img/server_running.png) ## 设计思路 ### 项目的主要逻辑层 #### 客户端部分 首先通过Windows的系统API获取剪切板内容,之后通过aes-256-ctr加密标准来对数据进行加密,如果数据是文本则通过`gz`进行压缩,图像则通过`png`进行数据封装,再通过Token验证的方式实现不同设备和平台上对称加密解密的功能以对信息进行读取。同时使用`ID时间戳`来防止广播风暴的问题。 #### 服务端部分 在接受到了来自服务端的数据包后,根据`groupip`对数据包进行相应的转发,如果被同步端验证能够通过则成功发送数据包进行转发同步,否则丢弃。 ## 重点难点 1. 对于同步的数据,如果短时间内发送太多请求会导致I/O堵塞,要寻求在`Rust`下对数据进行异步处理的办法,以对同步的I/O进行优化处理。 2. 信息的传递过程中有概率会出现干扰问题,需要使用可靠且稳定的协议来对数据实施可靠传输。 3. 信息在传递过程中有被拦截并获取的风险,需要使用安全且有效的加密协议对数据本身或通信通道进行加密,防止信息的外泄