javascript - 如何可靠地散列 JavaScript 对象?

标签 javascript json node.js hash

如果 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/

相关文章:

ios - 核心数据导入速度很慢

c# - 从 MVC 3 JsonResult 获取美化的 JSON

node.js - apm(atom的包管理器)启动shell运行错误

node.js - React - 仅在 HTTPS 上发送 POST 请求时出现网络错误

javascript - 提交在 javascript 中不起作用

javascript - EventDrops for D3.js(来自 marmelab) - 如何调整示例代码?

javascript - 如何将相同的 javascript 添加到 Acrobat pdf 中的互斥复选框?

C# Web API POST 参数 FromBody 始终为 null

javascript - 将所有 URL 重定向到 Parse.com 上的 index.html

javascript - 如何从内联 javascript 中抓取 url