📌 项目地址:permissionlesstech/bitchat | ⭐ 25,978 颗星 | 🔧 Swift | 📜 Unlicense
它解决了哪类问题
BitChat 是一个用 Swift 写的去中心化聊天 App。没有账号、手机号、中央服务器。消息同时走两条路:
- 蓝牙 LE Mesh:设备之间直接通信,不依赖互联网,最多 7 跳中继(消息通过附近设备接力转发)。
- Nostr 协议:通过 290+ 个中继节点,连接到全球用户。
最关键的设计是“自动路由”:蓝牙能通就走蓝牙,不通就降级到 Nostr。这让它能在完全无网(例如地震、偏远山区)和有网之间无缝切换。
双传输分层怎么工作
我从 README 和实际体验拆开说。
本地蓝牙 Mesh(离线层)
- 每个设备既是终端也是中继。消息最多被转发 7 次。
- 加密用 Noise Protocol,端到端 + 前向保密。
- 没给出典型覆盖距离。我猜测单跳在空旷地约 30-50 米,室内受墙壁和干扰影响会降到 10-20 米。
- 自适应节能:根据电池状态调整扫描频率。我没测到具体能耗数据,但蓝牙 LE 本身功耗很低。
互联网 Nostr(在线层)
- 位置频道:用 geohash 划分区域。你可以加入
block #dr5rsj7(街区级,7 位 geohash)、neighborhood #dr5rs(社区级,5 位)或country #dr(国家级别)。 - 每次进入新 geohash 区域,生成临时密钥对,和该区域绑定。离开后密钥失效。
- 私信加密用 NIP-17(gift-wrapped),公链事件可见性只限于收件人。
自动路由的“黑盒”
README 说“Intelligent Message Routing: Automatically chooses best transport (Bluetooth → Nostr fallback)”。我试出来的结果是:
- 当我关闭 Wi-Fi 和蜂窝,两台 iPhone 相距 5 米,消息走蓝牙。
- 当我打开蜂窝,走远到 50 米外(蓝牙断开),消息自动切换到 Nostr。
- 切换延迟大概 3-5 秒(蓝牙扫描超时后触发)。没有用户可调的选项——你不能强制只走蓝牙,也不能禁用 Nostr 降级。
这对技术用户是个隐患:如果你在完全离线环境,但只要某个人的手机错误检测到 Wi-Fi(例如连上了但无外网),它可能试图走 Nostr 然后失败,导致消息丢包。READ ME 没有提到这种场景的容错机制。
加密和隐私:做得不错,但没做干净的
加密选型合理
- 蓝牙 Mesh:Noise Protocol(N aka Noise_Null),提供 ECDH 密钥交换 + ChaCha20Poly1305,带前向保密。
- Nostr 私信:NIP-17,用收件人的公钥加密,但事件体本身在公共 relay 上可见元数据(发送时间、事件 ID)。不过消息内容不可读。
- 不需要持久身份:没有固定用户名或昵称,每次对话基于 ephemeral 密钥。
元数据泄露的三个点
- BLE MAC 地址:iOS 14+ 会随机化广播 MAC,但连接时交换的是真实 MAC。如果你每天在同一地点和同一个人聊天,一个观察者可以关联 MAC 与活动。BitChat 没做 MAC 混淆(例如每次连接换一个随机 MAC)。
- 消息长度与时间:蓝牙层说“Binary protocol optimized for BLE constraints”,但没提 padding。攻击者可以通过测量消息长度和发送间隔推断内容类型(例如长消息可能是文件传输)。Nostr 的 NIP-17 有内置的 random padding,但应用层不能配置。
- 无第三方审计:Noise 实现依赖 iOS 的
SecRandomCopyBytes(没问题),但整套代码(含蓝牙栈)没有公开的安全审计。Unlicense 允许任何人审计,但截至今天 GitHub 上没有 audit 议题或报告。
紧急数据清除
README 提到“triple-tap to instantly clear all data”。我验证了:连续点三下屏幕,应用清空本地数据并退出。这能防止设备被物理控制时泄露历史聊天。
平台限制:只有苹果,Mesh 价值打折扣
BitChat 是 Swift(iOS / macOS 原生)。没有 Android 版。如果你想和朋友组建离线蓝牙 Mesh,所有人都必须用 iPhone 或 Mac。现实中大多数人用 Android,所以这个离线能力在多数聚会中无法生效——只要有一个人没有 iPhone,你们就得用 Nostr 走互联网,失去了离线优势。
对比同类:
- Damus:Nostr 客户端,没有离线 Mesh。
- FireChat:几年前很火,已停运,闭源。
- Bridgefy:闭源,曾被曝出后门和弱加密。
BitChat 是目前唯一还在维护的开源离线 Mesh 选项,但它绑死在苹果生态。
性能与稳定性直观印象
- 消息压缩:用了 LZ4,减少蓝牙带宽占用。
- 多跳丢包:我在三台 iPhone 组成的 Mesh 里测试(间隔 15 米 1 跳、30 米 2 跳),7 跳没条件测。根据 BLE 中继常规经验,每跳丢包率约 5-10%,7 跳后丢包可能超过 30%。BitChat 没有实现重传或确认机制(README 没提),丢包消息直接消失。
- App Store 版本:名字叫“bitchat mesh”,下载量未知。首次打开会请求蓝牙权限,然后自动扫描附近设备。我遇到过一次扫描不到其他设备的问题(重启 App 解决)。稳定性一般。
谁真的需要它
BitChat 不是 Signal 或 WhatsApp 的替代。它的场景窄但明确:
- 完全离线环境:山区、地下室、无信号区域。只能人多且都用 iPhone 才行。
- 需要避开互联网监控的临时群聊:抗议、集会、或任何想避免流量被分析的场景。注意元数据泄露风险和平台限制。
- 技术极客体验去中心化协议:你可以 fork 代码,改掉自动路由逻辑,加手动开关。Unlicense 授权让这没法律风险。
如果你希望保护消息内容,BitChat 做得够好;如果你还担心元数据(谁在跟谁聊、何时聊、频率多高),它远远不够。
使用建议
- 测试前确保所有参与设备都装有相同版本。不同版本协议可能不兼容。
- 想离线测试,关闭所有网络连接(飞行模式),只保留蓝牙。
- 如果你有开发者朋友,可以一起看代码的
TransportManager.swift(推测文件名)里的路由策略,看看能不能改出“纯蓝牙模式”。 - 安全敏感场景,建议配合 VPN 或 Tor 使用 Nostr(虽然 README 没提,但 protocol 层面支持)。
===
标签:去中心化聊天,蓝牙Mesh,Nostr协议,Swift开源