跳到主要内容

2.1.3. Binary-Wrapped HTTP Fields (二进制包装的 HTTP 字段)

2.1.3. Binary-Wrapped HTTP Fields (二进制包装的 HTTP 字段)

若应用已知所涉 HTTP 字段的值会导致序列化问题, 特别是如第 7.5.6 节讨论的将多个值合并为单行, 签名者应在组成部分标识符中包含 bs 参数, 以指示字段的值需要在合并之前包装为二进制结构.

若该参数随组成部分标识符一并出现, 组成部分值必须使用下列算法计算:

  1. 设输入为字段的有序值集合, 按其在消息中出现的顺序.

  2. 创建空 List 用于累积已处理的字段值.

  3. 对集合中每个字段值:

    3.1. 去除字段值的前导与尾随空白. 注意由于合规实现中 HTTP 字段值不允许包含前导与尾随空白, 此步在合规实现中应为空操作.

    3.2. 移除行内任何过时的行折叠, 并以单个空格 (" ") 替换, 如 [HTTP/1.1] 第 5.2 节所述. 注意该行为专属于 [HTTP/1.1], 不适用于 HTTP 规范的其他版本.

    3.3. 将所得字段值的字节编码为 Byte Sequence. 注意大多数字段限制为 ASCII 字符, 但某些实现中值可能包含其他八位组.

    3.4. 将 Byte Sequence 加入 List 累加器.

  4. 中间结果为 Byte Sequence 值的 List.

  5. 按 [STRUCTURED-FIELDS] 第 4.1.1 节所述对 List 进行严格序列化, 并返回该输出.

例如, 下列字段因内部逗号而无法安全区分各字段值:

Example-Header: value, with, lots Example-Header: of, commas

在本例中, 同一字段也可发送语义不同的单值:

Example-Header: value, with, lots, of, commas

这两种版本由应用不同处理. 然而, 若不带参数纳入签名基, 两种情况下组成部分值相同:

"example-header": value, with, lots, of, commas

然而, 若添加 bs 参数, 两个独立实例编码并序列化如下:

"example-header";bs: :dmFsdWUsIHdpdGgsIGxvdHM=:, :b2YsIGNvbW1hcw==:

对上面的单实例字段, 带 bs 参数的编码为:

"example-header";bs: :dmFsdWUsIHdpdGgsIGxvdHMsIG9mLCBjb21tYXM=:

该组成部分值与多实例字段不同, 从而避免可能被利用的碰撞.