为什么要专门写一份传输层规范
闪电网络是点对点网络:通道双方、路由中间节点、公告同步的邻居,之间走的是普通互联网连接。如果这些消息走明文,任何能看见流量的人都能知道谁在跟谁说话、哪笔付款正在这条路上跳。比特币自己的 P2P 通信在早期同样如此,后来由 BIP324 给节点连接上了锁;闪电网络则从协议起草之初就把加密传输写成了硬性规范——BOLT 8。它规定:所有节点间通信必须加密且必须可认证,明文连接在协议层面就不合法。

握手:三条消息换出一对会话密钥
每个闪电节点都有一把长期身份密钥——比特币曲线 secp256k1 上的一个公钥,它同时用于在网络上公告「这个地址属于我」。BOLT 8 的握手基于 Noise 协议框架的认证密钥交换模式 Noise_XK(规范里的完整配方名为 Noise_XK_secp256k1_ChaChaPoly_SHA256,用 secp256k1 曲线、ChaCha20-Poly1305 加密和 SHA256 哈希)。建立连接时,双方交换三条握手消息:发起方先亮出自己的临时 ephemeral 公钥,响应方回以自己的临时公钥并用长期密钥做认证,发起方再补一段用长期密钥签发的认证。三条消息走完,双方各自算出相同的会话密钥,而长期身份密钥本身从不在链路上裸奔——旁观者能验证「对面确实是这个 node ID」,却推不出长期密钥。
这个设计给了闪电一个常被忽略的性质:握手之后的所有消息内容、长度模式,对链路中间人都是一团随机字节。谁能读懂你们在说什么?只有两端节点。
密钥会定期换血
会话密钥不是建连时算一次用到底。BOLT 8 规定每累计加解密一千个消息单元就要做一次密钥轮换(规范里的表述是每加密或解密一千次、大约每五百条消息后换一次),换钥匙的动作在链路内部自动完成,不需要重新握手,也不中断业务。轮换的意义在密码学上叫限制「同钥数据量」:给攻击者用同一把钥匙观察的样本量设了硬上限。即便未来某条消息的加密被攻破,泄露窗口也被切成了几百条消息的小段。
加密只保证保密和完整性,不保证「对面不是骗子」。握手认证的是公钥与 node ID 的一致性;至于这个 node ID 是不是你以为的那家交易所的热钱包节点,取决于你怎么拿到它的地址——这是信任问题,不在密码学射程内。
和 BIP324 的分工
两套加密常被放在一起问。BIP324 保护的是比特币全节点之间的 P2P 连接,用 ChaCha20-Poly1305 加一个可选的混淆层,动机是抗流量分析和防中间设备干扰;BOLT 8 保护的是闪电节点之间的连接,身份直接绑在节点的长期公钥上,是协议生效的前提而非可选开关。两者的共同点是都放弃了 TLS 全家桶、选择轻量定制的对称加密配方——理由也类似:依赖库庞大、密码套件五花八门、实现出错的表面积太大。定制不等于更安全,它们的安全性最终落在实现质量上,这也是两套协议都附带完整测试向量的原因。
快速问答
问:Tor 上的闪电连接也是这套加密吗? 答:是叠加关系。Tor 只是底层传输路径的选择,BOLT 8 的握手加密在两种路径下都必须完成——规范开头就写明所有节点间通信必须加密且认证,不存在「走 Tor 所以免加密」的旁路。
问:握手失败通常是什么原因? 答:多数是网络层的:地址过期、NAT 打洞失败、对端重启后旧会话密钥失效。握手失败信息不应泄露密钥细节——调试时任何声称要「导出握手密钥」的教程都要警惕。
风险提示
本文是协议机制科普,不构成投资建议。连接加密保护传输内容,不保护你机器上的钱包与密钥;运行节点或操作资产仍需在本地环境安全与备份纪律上自行负责。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。