端到端加密(E2EE)
lsbot 的网页聊天(Bot Page)支持端到端加密,确保 relay 服务器(bot.lingti.com)即使被攻击也无法读取你的聊天内容。
什么是端到端加密?
普通聊天中,消息经过服务器中转,服务器可以看到明文内容。端到端加密将消息在发送端(浏览器)加密,在接收端(你的 lsbot 进程)解密,中间的 relay 服务器只转发无法解读的密文。
工作原理
- 密钥生成:lsbot 启动时,在
~/.lingti-e2e.pem生成或加载持久化的 P-256 椭圆曲线密钥对,并在日志中打印指纹。 - 密钥交换:浏览器打开 Bot Page 后,自动向服务器请求 bot 的公钥,生成一次性临时密钥对,通过 ECDH 协议在双方之间协商出相同的 32 字节 AES 会话密钥。
- 加密通信:协商完成后,所有消息均使用 AES-256-GCM 加密传输,每条消息使用独立随机 nonce,防止重放攻击。
所用算法:ECDH P-256 + HKDF-SHA256 + AES-256-GCM,全部为 Web 标准算法,无额外依赖。
验证指纹
为防止中间人攻击,你可以核对 bot CLI 打印的指纹与浏览器锁图标显示的指纹是否一致。
bot CLI 日志输出:
浏览器界面: 加密建立后,状态栏会出现蓝色锁图标,悬停可看到完整指纹(格式同上)。
两者一致即表示未被中间人攻击,通信安全。
relay 服务器能看到什么?
| 内容 | relay 服务器可见 |
|---|---|
| 消息明文 | 否 |
| 加密后的密文(base64) | 是 |
| 用户 ID / 连接 ID | 是 |
| bot 公钥(用于交换) | 是 |
浏览器兼容性
E2EE 依赖浏览器内置的 Web Crypto API(SubtleCrypto),以下版本起支持:
| 浏览器 | 最低版本 |
|---|---|
| Chrome / Edge | 113+ |
| Firefox | 130+ |
| Safari | 17+ |
不支持的浏览器将自动回退到普通明文传输,功能不受影响,但无加密保护。
重置密钥
如需更换 bot 的加密密钥(例如密钥文件泄露),删除 ~/.lingti-e2e.pem 后重启 bot 即可生成新密钥。旧密钥的历史会话将无法解密,但不影响新会话。
也可以通过 --e2e-key-file 指定自定义路径: