JSON 规范化会将语义等价的 JSON 数据转换为一个确定性的字节序列。这在哈希、签名、比较,或将 JSON 用作身份键之前非常有用。普通的 JSON 序列化并不足够:对象成员顺序、空白、转义方式和数字格式可能不同,而数据模型并未发生变化。
JSON 规范化方案 #
RFC 8785 定义了 JSON 规范化方案(JCS)。它采用 ECMAScript JSON 序列化规则,按照 UTF-16 代码单元的字典序序列化对象属性,不输出无意义的空白,并要求输入为有效的 I-JSON。
应规范化解析后的数据,而不是任意文本。应拒绝重复的对象成员名称、不受支持的数值(例如 NaN 和 infinity),以及无法在所选数据模型中表示的输入。数值精度十分重要:将每个数字都解析为二进制浮点值的实现,可能会在不易察觉的情况下改变大整数。
哈希与签名 #
应对规范化后的 UTF-8 字节进行签名,而不是对原始 JSON 文本进行签名:
- 根据定义的配置文件验证并解析 JSON;
- 使用符合标准的规范化器对其进行序列化;
- 对这些精确的字节进行哈希或签名;以及
- 在签名中记录规范化算法和签名算法。
规范化不会使不受信任的 JSON 变得安全,不会证明模式有效性,也不会替代经过身份验证的传输。它只为约定的数据值提供稳定的字节。生产者和验证者必须使用相同的规范化规则。
评论
在 GitHub 上阅读或评论(发表评论需要登录)