如何在javascript中的嵌套对象中对键的顺序进行排序?

时间:2018-07-12 12:39:19

标签: javascript express digital-signature

问题是: 我有一个带有以下参数的请求:

{ "foo": "bar", "bar": "baz", "baz" : { "nestedKey": "foo" } }

我需要使用Hmac512算法对其进行签名,因此需要首先对对象进行字符串化。

但是,我担心的是,如果不保留密钥的顺序,则服务器和客户端生成的签名可能会不同。

为了解决这个问题,我的想法仅仅是排序对象的键(包括嵌套在该对象内部的键)。

我该如何实现?

2 个答案:

答案 0 :(得分:1)

如OP中所述,对HMAC流程的输入 必须 是确定性的。

但是无论我们希望设置多少Javascript对象元素的顺序,都无法设置。 (我经常看到这个问题。)

答案是对字符串化的字符串本身进行排序。

有关解决方法,请参见json-stable-stringify

然后将结果字符串输入HMAC方法。无需对它进行base64编码。

答案 1 :(得分:0)

您需要确保双方的信息都是相同的,但是您根本不需要修改或修改该信息

基本上应用此算法

 base64(sign(utf8(json message)))

客户端

  1. Stringify:将javascript对象转换为字符串

  2. UTF-8:确保您使用的是已知且固定的编码,例如utf

  3. 符号:根据结果消息计算HMAC

  4. base64:将二进制签名转换为base64

发送给客户端json消息和签名

服务器端

从客户端获取原始消息,然后应用步骤2-4。检查签名是否相等