是否有一种可靠的方法来创建一个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}"}

推荐答案

你要求跨多种语言实现的东西是相同的...你几乎肯定不走运.你有两个 Select :

  • 查看www.json.组织实施,看看它们是否可能更加标准化
  • 在每种语言中使用自己的语言(使用json.org实现作为基础,应该没有多少工作要做)

Node.js相关问答推荐

NX无法使用缓存运行根级脚本

Mongoose更新在^8.0.3版中,许多似乎不能按预期工作

如何在MEVN堆栈中结合创建和更新表单流程?

Mongoose抱怨说,整数是数字,而不是整数

在内存中加载安全密钥安全吗?还是每次都从文件中读取?

为什么我收到此错误:MissingSchemaError:架构尚未为模型&业务&注册

一个函数中的两个依赖的NodeJS数据库操作.如果第二个失败了怎么办?

使用AWS SDK for JavaScript V3将图像从node.js上传到s3 bucket

Puppeteer 在本地运行良好,但在 Heroku 中运行不佳

为什么我不能将 id 发送到后端并通过 findByIdAndRemove() 删除项目?

如何使用 $PATH 变量在系统中全局自动安装 bash 脚本?或者重写脚本到node

访问 Mongoose 查询之外的变量

如果 express.js (node.js) http 请求在完成之前关闭会发生什么?

使用中的端口代码:'EADDRINUSE',即使在 kill 命令之后

AWS Kinesis 中的分区键是什么?

Passport 登录和持久会话

对不同对象中的函数使用相同的键时,V8 中的函数调用缓慢

如何让should.be.false语法通过 jslint?

gyp WARN EACCES 用户root没有访问开发目录的权限

将 Heroku App 连接到 Atlas MongoDB 云服务