{ "id":1, "info":{ "name":"x", "age":19 }, "course":[ "math" ], "timestamp":1575174600, "nonce":"xxx" }
{ "id":1, "info":{ "name":"x", "age":19 }, "course":[ "math" ], "timestamp":1575174600, "nonce":"xxx", "sign":"awoskedflvj" }
{ "data":{ "id":1, "info":{ "name":"x", "age":19 }, "course":[ "math" ], "timestamp":1575174600, "nonce":"xxx" }, "sign":"xcvoawierj" }
我只用 golang 简单验证了这样不会出错,json.RawMessage 可以很好的解决。
想请问下这样做有什么问题没?如果方案 2 有问题,方案 1 在存在嵌套 json 的情况下也有问题。
为什么很多地方都采用先排序再拼接的方式呢,仅仅是数据来源可能在 header 里或者 url 里之类的情况吗?
或者有什么通用的比较好的解决方案
![]() | 1 qiayue PRO 排序的目的是尽量让每一次请求的签名都不一样 |
![]() | 3 kkkkkrua 2019-12-16 18:11:14 +08:00 via iPhone 排序是为了消除一些传输中导致顺序更改的问题,你换成 json 的话,多一个空格你就验证不通过了 |
![]() | 4 index90 2019-12-16 18:15:48 +08:00 为什么不把签名信息放在 header 中? |
![]() | 5 index90 2019-12-16 18:23:03 +08:00 排序再拼接,一般是用于 query 参数的处理,你无法确保 client 的签名是 key 的顺序与 server 签名时 key 的顺序一致,所以一般会约定先按 key 排序再签名 body 的参数不应该篡改,直接当做 byte 数组进行签名 签名信息一般放在 header 中直接提取,而不是像你例子中那样,需要反序列化之后才能提取,这样多浪费计算资源 |
![]() | 6 x1aoYao OP |
![]() | 7 kkkkkrua 2019-12-16 18:37:35 +08:00 建议方案 1 的加密方式,sign 是否要放到 json 里,都可以,只要约定好就可以。 |