Security Architecture Whitepaper

安全技术白皮书

安全不是一份功能清单,而是一连串架构选择
本文档列出幽云轩已落地的真实密码学与协议实现,以及清晰的演进路线——
为技术评估、尽职调查与合作洽谈而写。

版本 1.02026-06面向技术评估者

Design Tenets

四条不让步的原则

所有具体机制都从这四条推导而来。它们决定了「即便我们想作恶,架构上也做不到」。

服务器不可信

默认假设服务器会被攻破。内容加解密只在设备本地完成,服务端自始至终只经手密文与无法伪造的元数据。

默认拦截

安全闸门一律 fail-closed:公钥发生变更则先拦下发送再告警,而非「先发了再提示」。仅靠提醒只能防君子。

信任锚在客户端

身份校验的根必须落在用户设备上。服务端的任何「签名背书」对一个被攻陷的服务端而言都是空的——所以我们不依赖它。

数据最小化

能不收集的就不收集,能留在设备上的就不上传。消息送达即按策略清除——云端没有囤积,就没有可被拿走的东西。

Threat Model

我们假设最坏情况

一个成熟的安全系统不靠「相信坏事不会发生」,而是预设它会发生,再用机制兜住。下面是我们明确防御的攻击面,以及对应的落地手段。

假设

服务器被完全攻破

攻击者拿到整个数据库 得到的只是 AES-256-GCM 密文;私钥从不上传,内容无从还原。

假设

链路被监听(on-path)

有人在网络中间窃听 全链路 TLS;WS 鉴权用一次性 ticket,会话 token 不进 URL、不落 access log。

假设

恶意服务端偷换公钥

服务端试图把对方公钥替换成攻击者的 客户端 TOFU 固定公钥、变更即告警并拦截发送,服务端换钥救不了它。

假设

会话 token 被盗

token 在某处泄露 JWT 锁定签名算法 + token 版本号,注销即全部失效;同账号仅单设备在线。

假设

账号密码泄露

密码被猜中或撞库 新设备登录必须经老设备审批;二级恢复密码独立设置,无弱兜底。

假设

枚举与拒绝服务

批量探测用户、刷接口、振铃骚扰 好友闸门 + 按 IP/账号限流退避 + 帧大小上限,把可被滥用的入口逐个收口。

Cryptographic Primitives

原语层:现代、正确、无捷径

安全产品最容易在最底层翻车——用了过时算法或错误参数。这是我们实际使用的原语,每一项都经独立代码审查复核。

用途算法 / 参数说明
消息内容加密AES-256-GCM认证加密(AEAD),每条消息独立随机密钥与 IV
会话密钥封装RSA-OAEP-SHA256用接收方公钥封装该条消息的 AES 密钥
随机数生成CSPRNG密钥、IV、ticket 均来自密码学安全随机源
备份密钥派生PBKDF2 · 600,000 次口令派生主密钥,再以信封加密保护数据密钥
备份数据加密AES-GCM信封加密:数据密钥保护内容,主密钥保护数据密钥
公钥指纹 / 安全码SHA-512 / SHA-256面对面比对的安全码与二维码指纹
ECB 模式 IV 复用 PKCS#1 v1.5 填充 自研密码学

End-to-End Encryption

端到端:服务器只是过路邮差

每一条消息在你的设备上加密,到对方设备上才解密。中间的服务器只负责转发一只锁好的盒子,自己没有钥匙。

🔒
发送方设备 随机 AES 密钥加密内容
用对方公钥封装该密钥
密文
☁️
服务器 只见密文,读不到内容
sender_id 取自 token 不可伪造
送达后按策略清除
密文
🔑
接收方设备 用私钥解封 AES 密钥
还原原文
逐消息密钥 已落地

每条消息使用独立的随机 AES-256 密钥,再用接收方 RSA 公钥封装。即使单条密钥被攻破,也不波及其它消息。

全消息类型覆盖 已落地

文字、图片、语音、文件、引用回复、群聊消息一视同仁地加密;语音 / 视频通话使用 RSA 协商的会话密钥保护信令与媒体。

发件人不可伪造 已落地

sender_id 由服务端从鉴权 token 中取出,而非客户端自报,从源头杜绝冒名发送。

云端不留痕 已落地

单聊消息送达后约 10 分钟内自动清除,群消息按各群保留时长清理;服务端不囤积可读内容。

Identity & Key Pinning

端到端的「立身之本」:你在和谁加密?

加密再强,若不能确认公钥真属于对方,恶意服务端就能中间人。我们用「首次信任 + 公钥固定 + 变更告警 + 面对面验证」补上这块,四端实现,算法逐字节对齐

公钥固定(TOFU) 四端已落地

首次见到对方公钥即固定到本地加密存储(KeyPinStore)。此后服务端再下发的公钥只作比对,不会被静默覆盖。

变更检测 + 告警 四端已落地

每次发送前与服务端最新公钥比对(reconcile);一旦公钥变化,会话页弹出红色告警横幅,提示可能存在中间人或对方换机。

发送闸门(fail-closed) 四端已落地

公钥处于「已变更」状态时,发送被直接拦截而非仅提示,直到用户确认。所有 1v1 发送点统一走 requirePinnedKey 闸门。

面对面安全码 已落地

提供可当面逐字比对的安全码(基于 SHA-512 取 60 字节分组),用于线下确认双方看到的是同一把公钥。

二维码携带指纹自动验证 已落地

面对面加好友的二维码载荷为 邀请码#公钥指纹;兑换时自动比对指纹,一致即标记为「已当面验证」,不符则自动撤销添加并告警。

服务端换钥收紧 已落地

公钥更新接口非任意可改:同钥幂等、首次放行,再次变更需密码或「新鲜 token 窗口(5 分钟)」,并记录 KeyVersion 随资料下发。被盗的存量 token 改不动公钥。

Protocol Hardening

协议层:把客户端当作不可信输入

原语正确不等于协议安全。经一轮独立深度审查后,我们对实时信令与接口逐项加固——这里列出的每一条都对应一个已收口的真实攻击面。

WS 控制帧白名单 已落地

WebSocket 入站帧限定为客户端可发起的类型;message / recall 等强制走 HTTP 闸门,杜绝伪造登出、伪造撤回、绕过好友校验直投消息。

历史消息访问控制 已落地

聊天室历史拉取强制校验调用者成员身份,非成员返回 404,封堵房间码枚举导致的密文与元数据越权读取(IDOR)。

通话信令好友闸门 已落地

呼叫信令投递前校验好友关系,非好友的应答与「离线」表现一致,消除按 userID 枚举振铃骚扰与在线探针。

群成员先校验后落库 已落地

群消息在写入前即校验成员身份,杜绝非成员向任意群注入消息行。

JWT 锁算法 + 版本号 已落地

校验时锁定签名算法(WithValidMethods HS256),引入用户级 token 版本号,注销即令旧 token 失效。

恢复路径加固 已落地

删除二级密码的弱兜底逻辑(未设置即禁用恢复),恢复失败纳入账号级指数退避,关闭账号接管路径。

抗资源耗尽 已落地

WS 帧 SetReadLimit 1MiB + HTTP body 大小上限中间件,防巨帧 / 巨包内存耗尽型 DoS。

本地 token 加密存储 已落地

客户端会话 token 改用加密存储(EncryptedSharedPreferences / 加密本地库),与密钥存储保持一致强度。

Transport & Network

传输与运维层的硬约束

内容已端到端加密,传输与凭据管理也不能松。这一层管的是 token、密钥、连接与滥用防护。

全链路 TLS / WSS 传输加密 已启用

HTTP 与 WebSocket 全程经 TLS / WSS 传输,会话 token、登录密码与全部元数据在链路上均为密文,杜绝中间人窃听与会话劫持。

TURN 临时凭据 已部署

通话中继不再用静态长期口令,改为 coturn REST 临时凭据:username = 过期unix:userID,credential 为 HMAC-SHA1,到期自动失效。已部署并实测中继收发。

WS 一次性 ticket 鉴权 已落地

建立 WebSocket 前先换取一次性 ticket(24 字节 CSPRNG、30 秒有效、不可重放),避免长效 JWT 进入 URL 与访问日志。

密钥与凭据出库 已落地

JWT 密钥、厂商推送 secret 等移出代码库(config → secrets → env 三层加载);启动时拒绝空或默认 JWT 密钥。

登录限流 + 抗代理伪造 已落地

登录 / 注册按 IP 固定窗口限流,账号维度指数退避(消除单账号锁定型 DoS);SetTrustedProxies(nil) 堵 XFF 伪造绕过。

媒体下载归属校验 已落地

媒体 blob 绑定收发双方 / 群成员,下载前校验归属,未授权返回 404,封堵直链遍历越权下载(IDOR)。

Account & Privacy by Architecture

隐私是默认设置,不是开关

很多隐私风险来自产品默认形态,而非加密强度。我们把这些默认值逐条翻了过来。

单设备登录 + 设备审批

同账号仅单设备在线,新设备须经老设备批准;二级恢复密码独立设置。密码泄露也难被登入。

邀请码社交图谱

没有手机号搜索、附近的人、陌生推荐。只有拿到你邀请码(或当面扫码)的人才能加你。

安全箱

独立密码守护的本地隐藏会话,内容不经服务器;收起入口后,连「它存在」本身都不可见。

信封加密备份

聊天记录备份采用信封加密(口令 PBKDF2 派生 + AES-GCM),密钥不离身,云端也读不懂。

送达即清除

单聊送达后云端密文约 10 分钟自动清除,群消息按保留时长清理。没有囤积,就没有可被取走的历史。

连运营方也读不到

私钥只在设备本地,我们既没有也无需它。技术上,运营方无法读取用户消息——这是架构事实,不是承诺。

Cross-Platform Parity

三端原生,安全实现逐字节对齐

安全能力最怕「这个平台有、那个平台漏」。我们的客户端各自原生开发,但密码学与校验逻辑严格对齐——尤其是公钥指纹 / 安全码的算法,跨端逐字节一致,才能面对面互验。

Android

Kotlin + Compose
EncryptedSharedPreferences 存固定公钥

Windows

Compose Desktop
加密本地存储 + 发送前 reconcile

HarmonyOS

ArkTS 原生
发送闸门内置 reconcile,覆盖换钥

Roadmap

演进路线:对标 Signal 的剩余拼图

我们清楚地知道距离「业界最高标准」还差哪几块,并已在推进。下面是路线图——技术方向明确,工程在路上。

前向保密进行中

双棘轮(Double Ratchet)+ X3DH 密钥协商

引入 X25519 / Ed25519 与 X3DH,逐消息推进棘轮。目标:即便长期私钥未来某天泄露,历史消息依旧无法被解密(前向保密 + 后向恢复)。服务端仅充当预密钥目录与不透明信封,1v1 消息表零改造。

群组加密规划中

Sender Keys 群棘轮

在棘轮体系上扩展群组的 Sender Keys 方案,把前向保密延伸到群聊,兼顾大群的转发效率。

身份验证规划中

持久「已验证」盾标

在好友列表与会话页常驻显示验证状态盾标(当前已具备变更红色告警),让「已当面验证」的可信关系一眼可辨。

多端规划中

多设备密钥共享(方案 A)

在保持端到端与前向保密前提下,支持同一身份的多设备安全协同,作为棘轮落地的前置设计一并推进。

想深入了解?

欢迎技术尽调、源码层面的安全评估,或私有部署 / 合作洽谈。我们乐意展示「真东西」,而不只是这页文档。

联系我们洽谈 →