RFC8610附录G.3 CBOR诊断记法<<>>编码无歧义性技术问询
结论
RFC 8610里定义的<< >>嵌入式字节串编码方案具备单射性,不存在不同CBOR项序列编码出相同字节串的歧义问题。
核心逻辑
CBOR本身是自界定的二进制编码格式,单个合法CBOR项的长度不需要额外分隔符就能确定:
- 对整数、固定长度的字符串/字节串/数组/映射、浮点数、标签、简单值这类固定长度的项,解析器读第一个字节就能算出整个项占多少字节。
- 对不确定长度的数组、字节串这类项,解析器会顺着嵌套结构往下读,直到找到匹配的结束中断码
0xff,就能确定项的结束位置。
这种设计决定了:你不可能找到两个不同的合法CBOR项,其中一个的编码刚好是另一个编码的开头部分(也就是前缀自由属性)。顺着这个属性推导,多个CBOR项拼起来的字节串,拆分方式是唯一的:从第一个字节开始读,第一个项占多少字节是确定的,读完第一个项剩下的字节再按同样规则读第二个项,直到整个字节串读完,不会有第二种拆分可能。
举个最简单的例子:<<1,2>>编码出来是h'0102',你不可能拆出别的合法项序列——第一个字节0x01对应整数1,占1字节,剩下的0x02对应整数2,刚好用完所有字节,没有其他拆分可能。
常见误解
很多人觉得这个编码有歧义,其实是用错了解析方式:如果把承载多个CBOR项的字节串硬当成单个CBOR项解析,当然只会读到第一个项,剩下的内容会被当成冗余数据忽略,但这是解析逻辑的错误,不是编码本身有歧义。
就算是恶意构造的非规范编码(比如给小整数用更长的长度字段存储),只要是符合CBOR标准的合法编码,就依然满足自界定属性,不会出现不同序列编码结果相同的问题。只有构造出来的字节序列根本不符合CBOR项的合法性要求,才会解析失败,这已经不属于<< >>记法规定的“承载零个或多个CBOR项”的适用场景了。
内容的提问来源于stack exchange,提问作者Marc Ilunga
相关产品推荐
相关产品推荐

