ONYX:自托管端到端加密即时通讯,支持离线局域网模式
ONYX 在部署便捷性与强大功能之间实现了完美平衡:基于 Node.js 的服务器,搭配 MariaDB 和 Redis,客户端采用 Flutter 开发,支持 Android、Windows、macOS 和 Linux。它全面支持端到端加密(使用 X25519 和 XChaCha20-Poly1305),并独创离线局域网通信模式,通过 UDP 广播实现无互联网环境下的即时消息传递。
架构与技术栈
服务器基于 Express 搭建,集成 WebSocket(express-ws + ws),数据存储使用 MariaDB,会话与缓存由 Redis 管理。文件存储于兼容 S3 的系统中,采用 AWS SDK v3。传输协议包括 wss:// 和 HTTP/REST。加密方案使用 X25519 进行密钥交换,XChaCha20-Poly1305 加密消息,局域网内媒体传输则采用 AES-256-GCM。
XChaCha20-Poly1305 相较于 AES-GCM 的核心优势:
- 执行时间恒定,不依赖 AES-NI 指令集支持。
- 非常长的随机数(192 位对比 96 位),显著降低长时间运行会话中的碰撞风险。
加密数据包格式:[公钥 32B] [随机数 12B] [密文] [MAC 16B]。
局域网模式:自动发现与离线通信
客户端每 5 秒向 255.255.255.255:45678 发送一次 UDP 广播包,内容为 JSON 格式:
{
"username": "alice",
"timestamp": 1710000000000,
"pubkey": "<X25519 公钥,base64 编码>"
}
接收方客户端自动更新内部映射表,记录 用户名 → IP 和 用户名 → 公钥。无需 mDNS、手动输入 IP 或额外握手流程,加密通信即刻启动。
媒体文件以约 32 KB 的分块形式通过端口 45679 传输,每一块均独立使用 AES-256-GCM 加密。一旦接收到首块数据,即可立即开始解密和渲染,实现低延迟体验。
多设备同步,全程端到端加密保护
添加新设备时,需从已信任设备获取授权。授权通过后,密钥完成交换——服务器始终无法接触明文数据。
在私聊中,服务器将加密后的消息副本分别发送至每个用户设备(按设备公钥加密)。仅接收消息在设备间同步;发送的消息仅在原设备可见。此设计兼顾安全性与基础同步需求。
密钥派生机制:使用 HKDF-SHA256,标签分别为 onyx-lan-v2(用于局域网)及各私聊专用标签。
跨平台客户端:基于 Flutter 的统一开发框架
一套代码适配四大平台。Flutter 基于 Skia/Impeller 引擎,确保全平台流畅 60 FPS 表现,无 DOM 性能开销。桌面端优化功能包括:
fps_booster、fps_optimizer、fps_stimulatormessage_load_optimizer、chat_preloader
桌面专属功能:
- 系统托盘支持最小化操作
- 通过 IPC 实现单实例运行
- 自定义标题栏,支持拖拽区域
- Windows 平台原生通知支持
安全能力超越端到端加密
- 使用 Flutter Secure Storage 实现 PIN 码与生物识别验证
- 支持代理配置(
proxy_manager.dart) - 安全存储:Keychain / Android Keystore
- 会话管理:可查看并删除来自可信设备的会话记录
账户仅需用户名与密码登录,无需手机号或邮箱。用户名永久有效,应用内支持多账号切换,且提供彻底的数据清除功能。
群组、频道与自托管实例
通过 ONYX 服务器内置群组与频道功能——同步过程不启用端到端加密。
外部自托管选项:
- 局域网环境:无需联网即可实现文件共享与聊天
- VPS 上搭建私密社区,通过邀请制访问
- 公开频道,支持邀请订阅制加入
连接方式:在 external_server_join_screen 中输入服务器地址。部署方式:使用 ONYX Server。
群组:双向互动;频道:仅管理员可发布。
本地“收藏”存储功能
专设标签页用于保存笔记、分类信息(如密码、媒体、链接),所有数据仅本地存储,不进行同步,也不触达服务器。
核心亮点:
- 离线局域网:UDP 广播 + 分块媒体传输
- 端到端加密栈:X25519、XChaCha20-Poly1305、会话密钥管理
- 多设备支持:按设备加密,安全授权流程
- Flutter:全平台优化 60 FPS 用户界面
- 自托管:支持外部实例用于群组与频道管理
项目目前处于测试阶段,特别适合私密通信与离线局域网场景。
— Editorial Team
暂无评论。