ThePhantomPuppet/SKYTALE
GitHub: ThePhantomPuppet/SKYTALE
一款端到端加密的可安装 PWA 即时通讯应用,通过 Signal 风格加密协议和零知识中继架构对抗大规模监控。
Stars: 0 | Forks: 0
# SKYTALE
一款端到端加密通讯软件,以可安装的 **PWA** 形式提供,旨在对抗**无差别的大规模监控**(即欧盟的 "Chat Control" / CSAR 提案)。
得名于 [scytale](https://en.wikipedia.org/wiki/Scytale),一种古希腊斯巴达的换位密码。
## 原理
服务器是一个**只负责存储密文的“哑”邮箱**。它永远无法看到明文。所有的加密和解密均完全在设备本地进行。中继服务器只能获取到物理寻址所必需的最少信息——而在采用密封发件人(sealed sender)机制的情况下,它甚至连*谁*发送了该信息都不知道。
## 安全模型
采用两层独立的加密机制,外加一个旨在最小化元数据的传输层。
### 1. 静态存储(在设备本地)
```
passphrase --Argon2id(salt, high memory cost)--> KEK (non-extractable, RAM only)
KEK --wrap / unwrap (AES-256-GCM)--------> DEK (non-extractable, random)
DEK --AES-256-GCM (fresh 96-bit nonce + AAD)--> every record
```
DEK 是一个**不可导出的 `CryptoKey`**,因此原始密钥材料永远不会被 JS/XSS 读取。错误的密码短语会因 GCM 身份验证标签校验失败而被检测出来——无需单独的验证器,除了 Argon2id 本身之外,没有任何可供离线暴力破解的切入点。
### 2. 传输过程(网络上的端到端加密)
- **X3DH** 握手,用于从预共享密钥束中建立共享密钥。
- **Double Ratchet**(Signal 风格,基于 libsodium 原语——使用 Ed25519 进行签名,X25519 进行密钥协商),提供**前向安全性**和**后泄露安全性**,且容忍乱序传递。
- **密封发件人**:中继服务器将消息路由至接收者的化名,而无需知道发送者是谁。剩下的只有任何基于地址的传输系统都会泄露的不可避免的信息残留(例如目标收件箱、收发时间和数据大小)——这些都会被明确记录在文档中,绝不隐瞒。
### 3. 多设备(身份、关联与吊销)
- **主身份**(交叉签名密钥)锚定用户的所有设备;主**私钥**永远不会离开主设备。
- **设备关联**通过 **SAS**(人类可在两个屏幕上比对的 7-emoji 短验证字符串)来配对新设备——在人类确认之前,该关联通道仅传输公开材料。
- 通讯对端的每个授权设备都会建立其**独立的** X3DH 与 ratchet 会话(基于设备的分发扇出)。不变式:每个会话中的消息密钥仅被精确使用**一次**——ratchet 绝不在不同设备间共享(避免二次重用 / two-time pad)。
- **吊销**是一个由主密钥签名的设备列表:若某设备未出现在更新的列表中,则会丧失可达性。对端将停止向其分发消息。
完整的威胁模型(包括刻意排除在范围之外的内容)位于 **[SECURITY.md](SECURITY.md)** 中——其中包含了逐个机制对照的详细剖析,并与代码保持同步更新。
## 技术栈
- **前端:** Vite + React 19 + TypeScript,可安装的 PWA
- **加密:** 通讯层使用 libsodium(Ed25519, X25519);静态数据保险库使用 Argon2id(hash-wasm)+ WebCrypto AES-256-GCM
- **后端:** Cloudflare Worker + **Durable Object**(WebSocket 中继,Hibernation API);使用无内容感知的 Web Push 进行唤醒
- **存储:** IndexedDB —— 仅存储密文
## 状态
| 领域 | 状态 |
| --- | --- |
| 静态存储保险库(Argon2id / KEK-DEK / AES-256-GCM) | ✅ |
| 身份标识(Ed25519 + X25519),安全码 | ✅ |
| X3DH + Double Ratchet(前向保密 + 后泄露安全,乱序支持) | ✅ |
| 中继 + 实时聊天(Worker + Durable Object) | ✅ |
| PWA 加固(CSP,更新提示,自动锁定,延迟加载) | ✅ |
| 密封发件人(发送者元数据最小化) | ✅ |
| 多设备:主身份 + 交叉签名的设备证书 | ✅ |
| 设备关联(SAS),基于设备的独立会话,吊销 | ✅ |
| 将*已发送*消息同步至您自己的其他设备 | ✅ |
| **关联初始同步**:新关联的设备可获取个人资料与联系人列表 | ✅ |
| 针对关联设备的可靠入站消息(基于 ACK 确认的设备列表重新分发同步) | ✅ |
| 关联初始同步:向关联设备同步完整的聊天**历史记录** | 🚧 [#1](https://github.com/PropagandaPand/SCYTALE/issues/1) |
| 设备管理(查看 / 移除关联的设备,设置设备名称) | 🚧 [#2](https://github.com/PropagandaPand/SCYTALE/issues/2) |
| 群组 × 设备(群消息送达成员的第 2 台设备) | ⏳ 延后实现 |
新关联的设备现在可以从主设备中拉取您的个人资料和联系人列表,因此它会明确显示为您的账户,而不是一个空壳。不过,聊天记录暂未同步——这是下一阶段的开发重点。
## 开发说明
```
npm install # .npmrc sets ignore-scripts (skips miniflare's sharp build)
npm run dev # Vite dev server (frontend only, no relay)
npm run build && npm run cf:dev # Worker + Durable Object locally (incl. relay)
npm run deploy # build + wrangler deploy
```
代码检查:
```
npx tsc --noEmit # type-check
npm test # node test suite (pure crypto + conversation layers)
```
测试套件使用 esbuild 打包与传输/存储无关的核心代码,并在 Node 环境下运行。每一项安全属性都至少有一个对应的断言,并且每个断言都配备了**阴性对照组**(特意输入错误的测试数据),以确保绿色的测试通过状态绝不会产生虚假的安全感。
### 双设备测试指南
1. 执行 `npm run build && npm run cf:dev`,然后在本地 Worker URL 中打开两个浏览器窗口(或者部署后直接在两台真实设备上打开)。**两台设备需要两个独立的存储源(origins)**——同一个浏览器配置文件下的两个标签页会共享同一个保险库,属于*同一台*设备。
2. 在每个窗口中分别创建一个保险库(设置您自己的密码短语)。
3. 在窗口 A 中:点击 **"Share me (QR / link)"** → 扫描二维码,或者发送关联链接(对方点击一下即可添加)。或者将链接/token 粘贴到 **"Add contact"** 下方。在另一个窗口进行相同的反向操作。
4. 其中一方先发送消息(成为 X3DH 发起方),另一方进行回复。此后 Double Ratchet 机制便会开始运转。
联系人数据包中**仅包含公钥**——该链接可以通过任何信道发送,哪怕是并不安全的信道。事后请比对你的**安全码**,以排除中间人攻击的风险。
## 局限性
- **元数据:** 中继服务器只能看到*哪个收件箱、什么时间、数据有多大*——永远看不到内容,且(在启用密封发件人的情况下)不知道发送者是谁。流量分析依然十分困难;要实现完整的网络层不可追踪性,需要借助 Tor 或 Mixnet。
- **代码分发:** PWA 会从服务器加载 JS,因此被攻破的服务器可能会提供植入后门的代码。这可以通过对已安装的应用进行 service-worker 固化以及可重现构建来缓解(但无法完全消除)。
- **终端环境:** 任何加密手段都无法防范被入侵的设备(如恶意软件、操作系统层面的客户端扫描,或物理接触未锁定的保险库)——这恰恰正是反对 Chat Control 提案的核心论点所在。
- **多设备:** 参见[状态](#status)——聊天记录暂未同步至新关联的设备,且群组消息目前也无法送达成员的次要设备。
*面向用户的应用支持多语言:默认使用系统语言,并可在设置中切换。目前已提供 12 种语言的精心翻译(de, en, es, fr, it, pt, nl, pl, ru, uk, tr, zh);多语言字符串正在逐步封装中,尚未翻译的部分将回退至德语源文件。面向开发者的内容——代码、注释、文档、提交记录——均使用英语。*
标签:PWA, 加密通讯, 即时通讯, 密码学, 手动系统调用, 端到端加密, 网络安全, 自动化攻击, 隐私保护