【发布时间】:2011-07-30 09:42:19
【问题描述】:
在 JavaScript 对象相同的情况下,是否有可靠的方法来JSON.stringify JavaScript 对象,以保证所有浏览器、Node.js 等中的 ceated JSON 字符串相同?
我想像这样散列 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}' - 可能其他字符串化实现可能会以不同方式处理空格、属性顺序等。
有可靠的跨平台字符串化方法吗?是否有“规范化的 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}"}
【问题讨论】:
-
您正在使用 json stringify - 作为序列化机制 - 进行散列。我不确定这是一个好主意 - 正是由于您遇到的原因。无论如何,JSON.stringify 非常有限,我不相信它会散列或序列化我的信息。例如,尝试 JSON.stringify(new Error('not going to work'))
-
我还想自我评论说 MD5 不是在这里使用的最佳哈希函数。
-
JSON.stringify 不是准备散列的好方法,即 JSON.stringify({b:2,a:1}) => '{"b":2,"a":1 }' , 而 JSON.stringify({a:1,b:2}) => '{"a":1,"b":2}'
标签: javascript json node.js hash