原始数据:
{
"id":1,
"info":{
"name":"x",
"age":19
},
"course":[
"math"
],
"timestamp":1575174600,
"nonce":"xxx"
}
方案 1:
- 按 key 的字典序拼接原数据字符串,过滤掉 sign 字段:course=["math"]&id=1&info={"name":"x","age":19}&nonce=xxx×tamp=1575174600
- 进行签名,放入 sign 字段得到新的 json
{
"id":1,
"info":{
"name":"x",
"age":19
},
"course":[
"math"
],
"timestamp":1575174600,
"nonce":"xxx",
"sign":"awoskedflvj"
}
方案 2:
- 把整个 json 当作字符串进行加签
- 将原 json 对象与签名字符串组装成一个新的 json
{
"data":{
"id":1,
"info":{
"name":"x",
"age":19
},
"course":[
"math"
],
"timestamp":1575174600,
"nonce":"xxx"
},
"sign":"xcvoawierj"
}
我只用 golang 简单验证了这样不会出错,json.RawMessage 可以很好的解决。
想请问下这样做有什么问题没?如果方案 2 有问题,方案 1 在存在嵌套 json 的情况下也有问题。
为什么很多地方都采用先排序再拼接的方式呢,仅仅是数据来源可能在 header 里或者 url 里之类的情况吗?
或者有什么通用的比较好的解决方案