是否有一种可靠的方法来创建一个JavaScript对象,以确保所有浏览器、 node 上的ceated JSON字符串都是相同的.js等等,假设JavaScript对象是相同的?
我想散列JavaScript对象,比如
{
signed_data: object_to_sign,
signature: md5(JSON.stringify(object_to_sign) + secret_code)
}
并在web应用程序(例如Python和Node.js)和用户之间传递它们,这样用户就可以对一个服务进行身份验证,并为该服务显示下一个服务的"签名数据",以判断数据是否真实.
然而,我遇到了一个问题,即JSON.stringify
在所有实现中并不是唯一的:
- 在 node 中.js/V8,
JSON.stringify
返回一个JSON字符串,没有不必要的空格,比如"{"user_id":3}". - Python的
simplejson.dumps
留下了一些空白,例如'{"user_id": 3}'
- 其他stringify实现可能会以不同的方式处理空白、属性顺序或其他任何内容.
是否有可靠的跨平台严格化方法?是否存在"标准化JSON"?
你会推荐其他方法来散列这样的对象吗?
UPDATE:
这就是我用来解决问题的方法:
normalised_json_data = JSON.stringify(object_to_sign)
{
signed_data: normalised_json_data,
signature: md5(normalised_json_data + secret_code)
}
因此,在这种方法中,不是对象本身,而是对其JSON表示(特定于sigining平台)进行签名.这很有效,因为我现在签名的是一个明确的字符串,在判断签名散列后,我可以轻松地将数据输入JSON.parse
.
这里的缺点是,如果我也将整个{signed_data, signature}
个对象作为JSON发送,我必须调用JSON.parse
两次,它看起来不太好,因为内部对象被转义了:
{"signature": "1c3763890298f5711c8b2ea4eb4c8833", "signed_data": "{\"user_id\":5}"}