SSL 应用程序数据零字节神话



最近我分析了几个SSL/TLS应用程序数据包,我发现相当有趣的是,一些数据包在SSL/TLS应用程序数据包的最开头以固定的7个零字节开头。

TLS 1.2 应用程序数据示例 1

TLS 1.2 应用程序数据示例 2

我不知道为什么会这样?直观地,加密的消息应该通过随机字节。

我认为这是伽罗瓦计数器模式特有的特点。在这种情况下,Wireshark所谓的"加密应用程序数据"是一个GenericAEADCipher,在RFC 5246第6.2.3.3节中定义,并以以下内容开头:

opaque nonce_explicit[SecurityParameters.record_iv_length];

RFC 5288 第 3 节描述了 GCM 的以下字段:

对于每个不同的值,nonce_explicit的每个值必须是不同的为任何固定密钥调用 GCM 加密函数。 未能满足此唯一性要求会显著降低安全性。nonce_explicit可能是 64 位序列号。

随机数不需要是随机的或不可预测的——但它绝对必须是唯一的(另见这个答案)。使用 TLS 记录序列号(不是 TCP 序列号!)是确保一个连接中唯一性的好方法,因此 NSS 遵循该建议(请参阅 lib/ssl/ssl3con.c ,NSS 3.27.1 中的第 2148-2167 行和第 2994-3016 行)。

因此,在新的TLS连接开始时,随机数将只是一堆零。请注意,在第二个屏幕截图中,最后一个字节已经01 - 大概是连接中的第二条记录。

每个 SSL

块中的 7 个前导 0 表示它不太可能是 SSL 加密数据。必须有一些混淆,或者这只是SSL流/块中的隐藏数据通道。

最新更新