如果 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”?
你会推荐其他方法来散列这样的对象吗?
更新:
这是我用作解决方法的方法:
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}"}
最佳答案
您可能对 npm 包感兴趣 object-hash ,这似乎具有相当好的事件和可靠性水平。
var hash = require('object-hash');
var testobj1 = {a: 1, b: 2};
var testobj2 = {b: 2, a: 1};
var testobj3 = {b: 2, a: "1"};
console.log(hash(testobj1)); // 214e9967a58b9eb94f4348d001233ab1b8b67a17
console.log(hash(testobj2)); // 214e9967a58b9eb94f4348d001233ab1b8b67a17
console.log(hash(testobj3)); // 4a575d3a96675c37ddcebabd8a1fea40bc19e862
关于javascript - 如何可靠地散列 JavaScript 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5559712/