有没有一种可靠的方法 JSON.stringify
一个JavaScript对象,以确保在所有浏览器,Node.js等中创建的JSON字符串相同,假设JavaScript对象相同?
我想像散列JavaScript对象一样
{
signed_data: object_to_sign,
signature: md5(JSON.stringify(object_to_sign) + secret_code)
}
并在不同的Web应用程序(例如Python和Node.js)以及用户之间传递它们,以便用户可以对一个服务进行身份验证,并向下一个服务显示“已签名数据”,以便该服务检查数据是否真实。
然而,我遇到了这个问题:JSON.stringify
在不同实现下返回的 JSON 字符串并不是完全一致的:
- 在 Node.js / V8 中,
JSON.stringify
返回一个没有不必要空格的 JSON 字符串,例如 '{"user_id":3}'。 - Python 的
simplejson.dumps
会保留一些空格,例如'{"user_id": 3}'
- 可能其他 stringify 实现也有不同的处理方式,例如空格、属性的顺序等等。
是否有可靠的跨平台 stringify 方法?是否有“标准化 JSON”?
您是否推荐其他方式来哈希对象?
更新:
这是我使用的解决方法:
normalised_json_data = JSON.stringify(object_to_sign)
{
signed_data: normalised_json_data,
signature: md5(normalised_json_data + secret_code)
}
所以在这种方法中,签名的不是对象本身,而是其JSON表示形式(特定于签名平台)。这种方法很有效,因为我现在签名的是一个明确的字符串,我可以在检查签名哈希后轻松地使用 JSON.parse
解析数据。这里的缺点是,如果我也将整个
{signed_data, signature}
对象作为 JSON 一起传输,我就必须调用两次 JSON.parse
,而且看起来并不那么好,因为内部的引号被转义了。{"signature": "1c3763890298f5711c8b2ea4eb4c8833", "signed_data": "{\"user_id\":5}"}