端到端加密(E2EE)

lsbot 的网页聊天(Bot Page)支持端到端加密,确保 relay 服务器(bot.lingti.com)即使被攻击也无法读取你的聊天内容。


什么是端到端加密?

普通聊天中,消息经过服务器中转,服务器可以看到明文内容。端到端加密将消息在发送端(浏览器)加密,在接收端(你的 lsbot 进程)解密,中间的 relay 服务器只转发无法解读的密文。

浏览器 ─[加密]→ relay 服务器(只见密文)→[解密]→ lsbot
lsbot ─[加密]→ relay 服务器(只见密文)→[解密]→ 浏览器

工作原理

  1. 密钥生成:lsbot 启动时,在 ~/.lingti-e2e.pem 生成或加载持久化的 P-256 椭圆曲线密钥对,并在日志中打印指纹。
  2. 密钥交换:浏览器打开 Bot Page 后,自动向服务器请求 bot 的公钥,生成一次性临时密钥对,通过 ECDH 协议在双方之间协商出相同的 32 字节 AES 会话密钥。
  3. 加密通信:协商完成后,所有消息均使用 AES-256-GCM 加密传输,每条消息使用独立随机 nonce,防止重放攻击。

所用算法:ECDH P-256 + HKDF-SHA256 + AES-256-GCM,全部为 Web 标准算法,无额外依赖。


验证指纹

为防止中间人攻击,你可以核对 bot CLI 打印的指纹与浏览器锁图标显示的指纹是否一致。

bot CLI 日志输出:

[Relay] E2E fingerprint: sha256:a3f7c91b2d4e8f06

浏览器界面: 加密建立后,状态栏会出现蓝色锁图标,悬停可看到完整指纹(格式同上)。

两者一致即表示未被中间人攻击,通信安全。


relay 服务器能看到什么?

内容relay 服务器可见
消息明文
加密后的密文(base64)
用户 ID / 连接 ID
bot 公钥(用于交换)

浏览器兼容性

E2EE 依赖浏览器内置的 Web Crypto API(SubtleCrypto),以下版本起支持:

浏览器最低版本
Chrome / Edge113+
Firefox130+
Safari17+

不支持的浏览器将自动回退到普通明文传输,功能不受影响,但无加密保护。


重置密钥

如需更换 bot 的加密密钥(例如密钥文件泄露),删除 ~/.lingti-e2e.pem 后重启 bot 即可生成新密钥。旧密钥的历史会话将无法解密,但不影响新会话。

也可以通过 --e2e-key-file 指定自定义路径:

lsbot relay --bot-id=... --e2e-key-file /path/to/my-e2e-key.pem