【发布时间】:2014-05-25 21:24:01
【问题描述】:
我正在用 javascript 对 json 进行数字签名,以供 c++ 验证。我正在使用json spirit 来解析使用maps 的json 为json Objects,所以Objects 需要以与c++ maps 相同的方式排序。
An Object can easily be sorted by javascript
function sortObject(o) {
var sorted = {},
key, a = [];
for (key in o) {
if (o.hasOwnProperty(key)) {
a.push(key);
}
}
a.sort();
for (key = 0; key < a.length; key++) {
sorted[a[key]] = o[a[key]];
}
return sorted;
}
但是,我不确定exact sorting method that c++ uses。
上面的代码是否足以让 javascript 以与 map 键排序相同的方式对 Object 键进行排序?如果没有,怎么办?
【问题讨论】:
-
不能保证对象的顺序......
-
@epascarello 看起来大多数浏览器都是按插入排序的,除了 Chrome 在可用时按整数排序。
-
为什么不在编码之后(分别在解析之前)对二进制表示进行签名(并验证)?那应该避免这样的排序问题。
-
@Perseids 我在考虑这个问题,但是 json-spirit 似乎无法将对象视为字符串,并且签名数据(消息、密钥、签名)是子对象。我已经用 Chrome 进行了测试,我可以确认它确实通过插入来维持秩序。不能对其他浏览器说同样的话:/
-
一些嵌套序列化怎么样?将有效负载对象序列化为 json 并创建一个仅包含签名和序列化有效负载的新对象,然后再次将其序列化以进行传输。在接收端,您反序列化外部 json,检查签名并反序列化有效负载。
标签: javascript c++ sorting map key