目前版本支持跨设备剪贴板文字同步( win 、linux 、mac ),接下来要做跨平台的截图和文件拷贝。
顺便问下,哪位仁兄公司招人,北京 nodejs 、python 研发均可。
微信:erriye
以下为 github readme 文档内容
基于**kns[地址解析]-relay[内网穿透]-rpc[远程调用]**的去中心化的类 icloud 账号通讯体系
请自行确保本机已安装 gpg 套件
点击登录,弹出账户登录页面
注意:
- 第一个设备登录时,本机必须有这个 gpg 的私钥,确定能签名数据。
- 第二个设备登录时,如果本机依然有私钥,则可以直接本机签名登录,否则会向已登录的设备发送登录请求,已登录且能使用 key 签名的设备会在菜单中显示登录请求,允许后即完成登录。
确定后会调用 gpg 进行签名登录信息操作,完成后即登录完成
注意,只有服务器建议 docker 启动,提供 kns 和 relay 服务
剪贴板、账户系统都在 electron 部分代码中,docker 中不会启动此部分代码
docker 直接启动服务
# 因为需要获取本机真实 ip,所以 net 指定为 host 模式
docker run -d --net=host erriy/third --port 5353 --provider --enable-relay
docker-compose 启动
# 拉取预构筑镜像启动
docker-compose up --build third-image
# 本地构建启动
docker-compose up --build third-build
下载并安装依赖包
git clone https://github.com/Erriy/third
安装依赖包
# 在源代码根目录执行
npm install
启动 ui 界面服务,页面使用 vue 编写
npm run vue:serve
启动 electron 应用( ui 显示部分依赖 vue,建议启动完 vue:serve 后再启动)
# 在 windows 下可能存在中文输出乱码,使用 chcp 65001 命令切换 shell 编码后即可正常显示中文
npm run electron:serve
打包应用(打包完成后在 dist 文件夹中)
npm run build
kns ( key name system )主做类 dns ( domain name system )的基于 pgp 公钥指纹的地址解析模块
{
// 指定 record 过期时间,不指定则为创建后 5 分钟过期,过期机制防止历史数据被恶意利用
"expire": "...",
// 附属子设备,可以不指定
"device": [],
// 服务地址,可以不指定
"service": "http://xxxxx",
// 是否提供 kns 查询和存储功能
"provider": false
}
{
// pubkey 为 pgp 公钥数据,供验证 signed 部分签名是否正确
"pubkey": "...",
// signed 为实际签名部分,对 record 的对象 JSON 序列化后的 clearsign
"signed": "..."
}
以下方 record 为例,解析过程如下:
{
// 公钥
"pubkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nxjMEYRY2BhYJKwYBBAHaRw8BAQdAkOqLs1eMpGDDEsXg220YLdm4ZSsLViZc\nB1vD4Wfw0kPNBXRoaXJkwowEEBYKAB0FAmEWNgYECwkHCAMVCAoEFgACAQIZ\nAQIbAwIeAQAhCRB/ULsrLsg+PxYhBBuBUCZT+khM+paIKn9QuysuyD4/VAwA\n/A2R51vmuELCaT7gZ4AAvY5czskvt7PCtysIBhtKSLN3AP9VN4Uy4pr6oofP\nl3/JwBpiHmrtZ6LxzfWs6acpUxtqCc44BGEWNgYSCisGAQQBl1UBBQEBB0C5\nZGUFsxcfZoUutRgEYIu/HuH83C8ubV3v0xFfCCJfHwMBCAfCeAQYFggACQUC\nYRY2BgIbDAAhCRB/ULsrLsg+PxYhBBuBUCZT+khM+paIKn9QuysuyD4/JV0B\nANw7XgMMf5sG9yD9EGHG6UNp6d/N0NGy7TrSUNLfG/5GAQDWNwkL+xcn14b5\nW8Z7BvWeqYimNz8Cd54Ggzjpb/bEBw==\n=uyqt\n-----END PGP PUBLIC KEY BLOCK-----\n",
// 签名后的 object 对象
"signed": "\n-----BEGIN PGP SIGNED MESSAGE-----\nHash: SHA512\n\n{\"service\":\"http://192.168.199.149:34105/\",\"expire\":1629693271.874}\n-----BEGIN PGP SIGNATURE-----\n\nwnUEARYKAAYFAmEZ/ZcAIQkQf1C7Ky7IPj8WIQQbgVAmU/pITPqWiCp/ULsr\nLsg+P8LrAPkBG747gXTJNS1LI9kQwlLLBAKT4prr5B0gExbh5/gz0QEAwgRR\nQgwzda5fudsFYogPhDMClHODhlnzabsN8he7XAk=\n=khc4\n-----END PGP SIGNATURE-----\n"
}
mdns 功能主要做内网设备发现,在 mdns 功能启动的情况下,会周期性内网 query 'third.local'域名,所有开启 mdns 功能的其他终端均会响应,具体原理查看mdns词条。
以下内容中包含的距离,使用 sqlite 中的字符串排序计算
支持简单的 dht 网络搜寻功能,主要目的是去除对 bootstrap 初始节点的依赖,方便全网设备的互相发现。
relay 模块主做 http 请求中继功能(反向代理),类 ngrok 、frp 的内网穿透模块,但是仅支持 http 协议,客户端可以嵌入到代码中使用。
以下时序图演示的是 relay 工作流程
基于 http 做的 rpc 调用,方便设备间访问,流程如下
账户 record 与设备 record 一致,包括 device 字段的则认定为是一个账户记录。
账户记录会调用 gpg 进行签名,本软件目前并不负责账户的创建和管理工作,
如果使用 subkey 做 device key 的话,subkey 丢失需要主 key revoke subkey,然后一直携带到主 key 的公钥中。随着设备的增多或 key 的变化,主 key 的公钥大小会逐渐膨胀,不是想看到的情况。sign-key 也是一样,对设备 key 进行签名则表示对 key 的信任,如果需要踢出设备的话,会需要 revoke 对设备 key 的签名,然后再发布,不如直接签发一段动态信任的数据可靠。