白皮书

KENI 的安全与加密

版本 1.1 — 2026-06

本文说明 KENI 如何加密你的数据、密钥存在哪、服务端看得到什么、看不到什么, 以及我们刻意做的取舍。写给真正会读白皮书的人 —— 简洁、不带营销。

1. 威胁模型

我们假设网络是敌对的、我们的基础设施已被攻破。目标是:即便攻击者对我们的 数据库有完全读权限,再加上客户端与服务端之间的流量抓包,也读不到你的 1:1 私聊文字。(群消息和你在 1:1 里发送的媒体按设计是服务端可读的 —— 见 §5。)

我们防御你自己设备上的恶意软件、被攻陷的对端(你朋友的手机), 或针对我们合规归档的合法传票(见 §5)。如果你的威胁模型要求对抗有传票权力的 国家级行为体,Signal 才是正确答案 —— KENI 做了不同的选择,并会诚实说明。

2. 密钥生成

首次安装时,客户端在设备本地生成两对密钥:

私钥绝不传到我们服务器。可选的 passphrase 备份(§4)是私钥离开设备的唯一途径, 且那份副本用一个由 passphrase 派生、我们永远看不到的密钥加密。

3. 按房间会话

两位用户开始 1 对 1 聊天时:

  1. 客户端 A 从服务器取 B 的身份公钥。
  2. 两端本地各自跑 X25519 ECDH,派生一个 32 字节共享密钥。
  3. 共享密钥作为 AES-256-GCM 的种子。每条消息用一个全新的 12 字节随机 nonce; 传输密文 + nonce。
  4. 群聊默认走服务端加密 + 一份合规副本(见 §5)。一个使用 Sender Keys 协议的端到端群聊模式(每位发送者一把轮换密钥,经各成员的成对会话分发) 已实现,但尚未默认启用。

我们尚未实现完整的 Signal Double Ratchet。目前用静态 X25519-ECDH 派生的 会话密钥 + 每条消息随机 nonce。这通过 AES-GCM 提供机密性与完整性,但提供 消息级的前向保密或后泄露安全 —— 若对端的身份密钥日后被窃,历史密文对持有者仍可解。 Ratchet 在路线图上。

4. 身份备份(零知识)

丢手机不该丢掉聊天历史。用户可选启用一个由 passphrase 守护的密钥托管:

  1. 用户输入一个 passphrase(≥ 8 字符),仅在设备本地录入。
  2. 客户端生成一个随机 16 字节 salt。
  3. 客户端跑 PBKDF2-SHA256,10 万次迭代,salt + passphrase → 256 位 KEK。
  4. 客户端用 KEK + 全新 nonce,以 AES-256-GCM 把 { identity_priv, identity_pub, prekey_priv, prekey_pub } 作为 JSON 加密。
  5. 客户端把 { version, salt, ciphertext } 上传到服务器。

服务器只存不透明密文。没有 passphrase 我们派生不出 KEK;没有 KEK 我们解不开。 passphrase 丢了 = 备份永久丢失。我们不会替你"重置"身份,因为我们做不到。

5. 合规归档(请知悉)

1:1 消息文字仅端到端加密 —— 没有合规副本,没有任何我们能解开的东西,连我们也不行。 群消息会保留一份用 KENI 平台公钥加密的合规副本(群聊按设计服务端可读;一个可选的 端到端群聊模式正在开发中、尚未启用)。这份群合规副本存在有两个原因:

平台私钥存于 HSM 级密钥库。访问需多方授权并记录理由。我们不会把归档拿去做产品分析、 广告或训练数据。如果这个取舍不符合你的威胁模型,请用 Signal —— 我们不会介意。

6. AI 功能(哪些数据离开你的设备)

AI 功能(KENI 助手、意图路由、摘要)不是端到端加密的。云端 LLM 必须读到你的提问才能 回答。我们的做法:

7. TURN / WebRTC 媒体

语音/视频用 WebRTC。信令经我们的 WS 网关(SDP 本身不是消息内容)。NAT 允许时媒体走 点对点;在对称 NAT 后则经我们的 coturn 中继(当前 8.210.91.228,TLS 在 5349)。中继看到的 是加密的 SRTP 包 —— 无法解密媒体。每次会话用网关以仅服务端密钥签发的 HMAC-SHA1 短期 TURN 凭证(24h TTL);用户从不接触永久 TURN 密码。

8. 我们刻意不做的事

9. 待解问题与路线图

10. 联系

在我们的密码学里发现 bug?想就上面某个取舍辩论?邮件 safety@hikeni.com。 我们每封都读,5 个工作日内回复。