【问题标题】:TLVs and sub-TLVs over websockets or what really to useWebsockets 上的 TLV 和子 TLV 或真正要使用的东西
【发布时间】:2015-12-15 09:52:16
【问题描述】:

我的服务使用 Web 套接字来传输数据。

我需要一种方法来编码树结构并通过 websocket 传输该树结构。我一直在阅读 TLV 和子 TLV 编码,这似乎是一个好主意,即它已经在诸如 Radius、LLDP 等协议中使用,这证明这是有效的,但是我的问题是这些协议通常在受信任的设备,即交换机/路由器之间(LLDP 除外)。我的问题是,我将传输包含子 TLV 的 TLV,这些子 TLV 确实具有随机大小/长度,并且它们没有静态定义的结构,例如,如果您查看第一个 TLV 中的概念已定义子 TLV,即

扩展 IS 可达性 TLV #22 然后你会看到这个 tlv 的结构是这样的:

  /* +-------+-------+-------+-------+-------+-------+-------+-------+
   * |                        Type                                   | 1
   * +---------------------------------------------------------------+
   * |                        Length ID                              | 1
   * +---------------------------------------------------------------+
   * |                        Neighbour ID                           | 7
   * +---------------------------------------------------------------+
   * |                        TE Metric                              | 3
   * +---------------------------------------------------------------+
   * |                        SubTLVs Length                         | 1
   * +---------------------------------------------------------------+
   * |                        SubTLVs value                          | variable
   * +---------------------------------------------------------------+
   * :                                                               :
   */

通过结构,我的意思是我已经预定义了 7 个字节的邻居 ID,3 个字节的 Metric,1 个字节的 SubTLVs 长度,然后才出现可变部分,但至少你有一些预先定义的位并且不能更改。

现在通过阅读一些书籍(主要是 H Gredler The Complete IS-IS Routing Protocol 2005 - 第 296 页),我发现了 4 种验证这些 TLV 的技术,即

1) 最大长度检查

2) Sub-TLV 溢出检查

3) 离散长度检查

4) TLV 内容模式检查

我根本无法相信来自用户的信息,但我还有另外两个问题,即如何验证 TLV 的值在哪里 a) 随机长度/大小,即我确实有一个值可能具有的范围,即不小于 1 字节不大于 700 kb 和 b) 我不能对该值执行任何模式检查,因为它是加密的,即不是可读形式,因此不能对其执行任何模式。

因此我的问题是: 如何实现相同的目标,即在其他结构中发送树结构,即可能是键值对或类似的东西(http 正在使用这个,应该是有原因的)。

TLV 方式真的是在树结构中传输数据的最佳选择吗?我知道,如果我以二进制形式发送它,我将一枪击中两只兔子,即在发送图片等文件时,我不需要使用一些有趣的 base64 编码等,但我真正想要的是一个适用的协议L5-7(即通过 websocket)将允许以树结构的形式发送数据,接收部分将能够识别和重新组装树,而无需考虑序列化和反序列化部分。那么 TLV 的第二个最佳替代方案是什么?考虑到我一方面使用 java,另一方面使用 javasctipt。

【问题讨论】:

  • 如果你已经建立了你的 TLV 消息结构,为什么不通过 websockets 发送二进制数据呢? (Websockets 会在它自己的协议中对数据进行封装和解包,但是解包后你会得到原始的二进制数据)。
  • 因为我不信任来自用户的数据,即我如何才能验证这个 tlv。 IE。它将在我不知道它们的大小的其他子 tlv 中,基本上如果我会以某种方式验证它们。因此,我正在寻找 tlv 的第二好的替代品
  • 嗯...我不确定实际问题可能是什么...当出现解析错误时,您不能直接挂断连接吗?
  • 看到这正是我的问题,我如何识别存在解析错误。我在我的问题中提到了 4 种不同的方式来分割 TLV,但由于该值是加密的,即 tlv 的部分无法读取/模式化/或匹配它始终是一个变量值,现在你如何验证类似的东西,这是我打算使用其他一些结构的唯一原因,它允许通过 websocket 传递树,但也允许严格检查,即如果这是键值对中的回车符或换行符,即我知道每个“sub-TLV”结束。
  • 基本上我想说的是,就我而言,从为 TLV 提到的这 4 种验证技术中,我最终只剩下一个,即只有长度检查,这让我感觉问题可能出现在特征中。这就是我问这个问题的原因。

标签: websocket tree binary tlv


【解决方案1】:

这是对 cme​​ts 中问题的回答,而不是原始问题。

有许多选项可让您检查协议错误:

  1. 由于您的type 使用了一个while 字节(并且您可能没有256 种不同的类型),您可以检查type 是否有效。如果不是,则存在协议错误。

  2. 您可以在可变长度value 字段之后添加一个两字节字段,其中包含value 字段的第一个和最后一个字节。如果这些不匹配,则存在协议错误;或者

  3. 您可以在value 之后添加一个固定大小的 MD5 哈希字段,并根据哈希值检查值的内容。如果数据无效,则存在协议错误(或中间人攻击)。

使用哈希(校验和),如选项 3(我建议使用 MD-5,但任何校验和方法都可以)是检查数据完整性和协议一致性的好方法。

使用第一个和最后一个字节审查(选项 2)将只检查协议一致性,而不是数据完整性。

验证 type 字段(选项 1)是检查协议完整性的一种简单方法,但容易出错(因为随机数据更有可能看起来有效)。

根据实际数据的长度(问题中的选项 1-3)检查接收到的数据的长度很容易出错,而且很可能 导致错误。这是因为多余的数据可能被认为是下一个“帧”的一部分,因此只有在数据丢失并且没有接收到更多数据时才会显示错误。

编辑:关于选项 2 与 3 的更多详细信息

当使用第一个和最后一个字节验证时,每帧随机数据通过此验证测试的几率应该约为 1:65,536(这对于非关键单帧数据来说可能是一个足够好的测试)。

此外,如果您的数据树包含许多“数据字段”值,那么该数字会增长得非常快。 (当提供随机数据时,一个 4 数据字段树只有 1:2^64 的有效性机会。

假设数据长度为 1 字节,字节值为 10(十六进制中的 0A)。

第一个字节和最后一个字节都等于 0A,这意味着验证字段必须是 0A0A 的两个字节值。这是 2^16 个选项中唯一可接受的值。

但是,它不保证数据完整性。

假设客户端使用evilproxy.com的服务连接到我们的服务器...

如果该值是值为 100001 的银行帐号,evilproxy.com 可以将帐号更改为任何值,只要第一个和最后一个数字相同(即 199991),允许evilproxy.com 更改数据,而协议的消息仍然有效。

另一方面,使用 MD5 等校验和意味着当本例中的帐号被操纵时校验和的值会发生变化。

MD5 使用 128 位(16 字节),这意味着随机验证字段值有 1:2^128 的机会“命中目标”(这个机会可以忽略不计)。

另一方面,如果evilproxy.com 知道您用于校验和的算法的“盐”,则该字段可以与数据一起更新。

因此,如果您希望传达更敏感的数据,最好考虑使用校验和。

【讨论】:

  • 我同意答案,除了零件号 3 即您提到“中间人攻击”的地方,如果数据无效并不意味着发生中间人。我认为这两者无关。
  • @tito,我同意,如果数据无效,并不意味着中间一定有人在攻击......但这是一个选项,校验和允许更多安全反对中间人攻击。你可以看到我更新的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
相关资源
最近更新 更多