cyberphone/json-canonicalization
GitHub: cyberphone/json-canonicalization
该项目实现了 RFC 8785 JSON 规范化方案,通过对 JSON 数据进行确定性的序列化和属性排序,使 JSON 文档能够可靠地用于哈希、签名等密码学操作。
Stars: 144 | Forks: 31

# JSON 规范化
诸如哈希和签名等加密操作,依赖于目标数据在序列化、传输或解析过程中不发生改变。
通过应用 JCS (JSON Canonicalization Scheme) 定义的规则,
以 JSON [[RFC8259](https://tools.ietf.org/html/rfc8259)] 格式提供的数据可以“原样”交换,同时仍可进行安全的加密操作。
JCS 实现这一点的基础是使用 ECMAScript [[ES](https://ecma-international.org/ecma-262/)] 中定义的 JSON 原语序列化格式,
将 JSON 数据限制为 I-JSON [[RFC7493](https://tools.ietf.org/html//rfc7493)] 子集,
并通过独立于平台的属性排序方案。
公开的 RFC:https://tools.ietf.org/html/rfc8785
简而言之,JSON 规范化方案的概念如下:
- 使用与 ECMAScript 的 `JSON.stringify()` 兼容的方法序列化原始 JSON 数据类型
- 在*递归*过程中对 JSON `Object` 属性进行字典序排序
- JSON `Array` 数据也会进行规范化,*但元素顺序保持不变*
### 示例输入:
```
{
"numbers": [333333333.33333329, 1E30, 4.50, 2e-3, 0.000000000000000000000000001],
"string": "\u20ac$\u000F\u000aA'\u0042\u0022\u005c\\\"\/",
"literals": [null, true, false]
}
```
### 预期输出:
```
{"literals":[null,true,false],"numbers":[333333333.3333333,1e+30,4.5,0.002,1e-27],"string":"€$\u000f\nA'B\"\\\\\"/"}
```
注意:对于平台间可互操作的规范化,输出也必须转换为 UTF-8,
此处以十六进制表示法显示:
```
7b 22 6c 69 74 65 72 61 6c 73 22 3a 5b 6e 75 6c 6c 2c 74 72 75 65 2c 66 61 6c 73 65 5d 2c 22 6e
75 6d 62 65 72 73 22 3a 5b 33 33 33 33 33 33 33 33 33 2e 33 33 33 33 33 33 33 2c 31 65 2b 33 30
2c 34 2e 35 2c 30 2e 30 30 32 2c 31 65 2d 32 37 5d 2c 22 73 74 72 69 6e 67 22 3a 22 e2 82 ac 24
5c 75 30 30 30 66 5c 6e 41 27 42 5c 22 5c 5c 5c 5c 5c 22 2f 22 7d
```
### 实现
|语言|URL|
|--------|---|
|Rust|https://crates.io/crates/serde_json_canonicalizer|
|JavaScript|https://www.npmjs.com/package/canonicalize|
|Java|https://github.com/erdtman/java-json-canonicalization|
|Go|https://github.com/cyberphone/json-canonicalization/tree/master/go|
|.NET/C#|https://github.com/cyberphone/json-canonicalization/tree/master/dotnet|
|Python|https://github.com/cyberphone/json-canonicalization/tree/master/python3|
|Elixir|https://github.com/pzingg/jcs|
|Ruby|https://github.com/dryruby/json-canonicalization|
|PHP|https://github.com/aywan/php-json-canonicalization|
### 结合 JCS 和 JWS (RFC7515)
[JWS-JCS](https://github.com/cyberphone/jws-jcs#combining-detached-jws-with-jcs-json-canonicalization-scheme)
### 在线浏览器 JCS 测试
https://cyberphone.github.io/doc/security/browser-json-canonicalization.html
### ECMAScript 提案:JSON.canonify()
[JSON.canonify()](https://github.com/cyberphone/json-canonicalization/blob/master/JSON.canonify.md)
### 其他规范化工作
https://tools.ietf.org/html/draft-staykov-hu-json-canonical-form-00
http://wiki.laptop.org/go/Canonical_JSON
https://gibson042.github.io/canonicaljson-spec/
https://gist.github.com/mikesamuel/20710f94a53e440691f04bf79bc3d756
标签:JS文件枚举, 可视化界面, 域名枚举, 数据可视化, 日志审计, 逆向工具