📌 项目地址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 密钥。

元数据泄露的三个点

  1. BLE MAC 地址:iOS 14+ 会随机化广播 MAC,但连接时交换的是真实 MAC。如果你每天在同一地点和同一个人聊天,一个观察者可以关联 MAC 与活动。BitChat 没做 MAC 混淆(例如每次连接换一个随机 MAC)。
  2. 消息长度与时间:蓝牙层说“Binary protocol optimized for BLE constraints”,但没提 padding。攻击者可以通过测量消息长度和发送间隔推断内容类型(例如长消息可能是文件传输)。Nostr 的 NIP-17 有内置的 random padding,但应用层不能配置。
  3. 无第三方审计: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 的替代。它的场景窄但明确:

  1. 完全离线环境:山区、地下室、无信号区域。只能人多且都用 iPhone 才行。
  2. 需要避开互联网监控的临时群聊:抗议、集会、或任何想避免流量被分析的场景。注意元数据泄露风险和平台限制。
  3. 技术极客体验去中心化协议:你可以 fork 代码,改掉自动路由逻辑,加手动开关。Unlicense 授权让这没法律风险。

如果你希望保护消息内容,BitChat 做得够好;如果你还担心元数据(谁在跟谁聊、何时聊、频率多高),它远远不够。

使用建议

  • 测试前确保所有参与设备都装有相同版本。不同版本协议可能不兼容。
  • 想离线测试,关闭所有网络连接(飞行模式),只保留蓝牙。
  • 如果你有开发者朋友,可以一起看代码的 TransportManager.swift(推测文件名)里的路由策略,看看能不能改出“纯蓝牙模式”。
  • 安全敏感场景,建议配合 VPN 或 Tor 使用 Nostr(虽然 README 没提,但 protocol 层面支持)。

===

标签:去中心化聊天,蓝牙Mesh,Nostr协议,Swift开源

这篇文章对你有帮助吗?

发表回复