基础原理
混淆与加密的区别
这两个词常常被当作同义词使用。它们不是,而这一区别决定了对某个特定网络来说哪种协议才是正确的选择。
阅读约 1 分钟最后复核
它们回答的是不同的问题
- 加密
- 回答的是「观察者能读到这些内容吗?」它把负载变换成只有持有密钥的人才能还原的形式。它的保证是数学性的、被充分理解的,而一套正确实现的现代密码套件不会是任何真实系统的薄弱环节。
- 混淆
- 回答的是「观察者能看出这是什么吗?」它塑造的是加密所留下的那些可见部分——握手结构、包大小、时序、元数据——使这条流不至于因属于某个特定协议而显眼。它的保证是经验性的,只在尚未更新分类器的对手面前成立。
这种不对称很重要。加密要么有效,要么被攻破,它不会因为有人看得更仔细而逐渐失效。混淆则是一场角力:它有效,直到对方更新了分类器为止——这就是为什么它需要被持续维护,而不是发布一次就了事。
不同的对手
| 担忧 | 加密 | 混淆 |
|---|---|---|
| 有人在共享 Wi-Fi 上读取你的流量 | 可以解决 | 不相关 |
| 网络运营方记录你访问了哪些站点 | 部分——主机名仍会泄露 | 有帮助,因为它移除了那个信号 |
| 过滤器丢弃它识别为 VPN 的流量 | 没有帮助 | 这正是它存在的意义 |
| 运营方见到加密流量就一律丢弃 | 没有帮助 | 如果流量像被放行的流量,就有帮助 |
| 有人攻陷了你所连接的端点 | 没有帮助 | 没有帮助 |
把第一列从上往下读,规律就很清楚了:加密针对的是面对观察者的机密性,混淆针对的是面对守门人的生存能力。只具备其一而缺少另一项的协议,会以特定且可预测的方式失败。
混淆在实践中是怎么做的
大体上有三种策略,它们在成本和可持续时间上各不相同。
- 随机化
- 让流量看起来什么都不像——没有固定头部、没有可辨识结构,从第一个数据包起就是均匀的随机字节。这能击败特征匹配。但面对一个会封锁任何无法确认之物的网络时它会失败,因为无法分类的流量恰恰是这种网络所丢弃的东西。
- 模仿
- 让流量看起来像某个被放行的特定协议,通常是 HTTPS。这能在默认拒绝的网络中存活,但前提是模仿在每一层都足够逼真;不完整的模仿比不模仿更显眼,因为那处不一致本身就是一个特征。
- 在真家伙内部做隧道
- 不去模仿被放行的协议——而是真正使用它,把隧道装进它的一个真实会话里。既然没有模仿,也就没有什么可以做错。代价是额外开销,以及通常的吞吐量损失。
混淆的代价
这些都不是免费的,与其假装没有代价,不如把话说清楚。
- 吞吐量。为隐藏包大小而填充,意味着发送不承载任何内容的字节。把隧道包进第二层协议,则会给每个数据包都加上头部。
- 延迟。额外的层意味着两端都要额外处理,而为掩饰时序而控制发包节奏,则意味着刻意不在数据就绪时立即发送。
- 脆弱性。模仿必须跟上被模仿的对象。浏览器在变;缺乏维护的混淆层自己会变成一个独特的指纹。
- 复杂度。活动部件越多,某个实现缺陷泄露出这一层本就为消除它而存在的那个信号的机会就越多。
在不受过滤的网络上,这些代价换不来任何东西,因此混淆应当是可以关掉的。到处默认开启,等于用实实在在的性能去交换一个你可能根本没有的问题的防护。
这在实践中意味着什么
- 先弄清楚你在防御什么。在不可信的咖啡馆网络上保护一次会话是加密问题,任何称职的协议都已经解决了它。
- 如果流量是被封锁而不是被读取,那就是混淆问题,此时协议选择关系重大。
- 优先选择在每一层都保持一致的方案,而不是仅仅「不寻常」的方案。不寻常本身就是一个信号。
- 为不做过滤的网络保留朴素而快速的配置,只在伪装能抵得上其代价的地方才使用伪装配置。
常见问题
混淆过的 VPN 更安全吗?
在密码学意义上并不是——混淆并不会在加密已经提供的机密性之外再增加什么。它增加的是抵抗被识别和被封锁的能力。如果没有什么在封锁你,那它就是有成本而无收益。
混淆会让 VPN 变慢吗?
通常会,程度不等。填充、额外的协议层和刻意的节奏控制,要么消耗带宽,要么增加延迟。具体取决于所用技术;在真实协议内部做隧道往往代价最大。
混淆能被检测出来吗?
任何特定的混淆技术最终都可能被检测出来,因为它是一种模式,而模式是可以被学习的。这就是这个领域持续演进的原因,也是对「永久不可检测」之类说法应当保持怀疑的原因。