问题是: 我有一个带有以下参数的请求:
{ "foo": "bar", "bar": "baz", "baz" : { "nestedKey": "foo" } }
我需要使用Hmac512算法对其进行签名,因此需要首先对对象进行字符串化。
但是,我担心的是,如果不保留密钥的顺序,则服务器和客户端生成的签名可能会不同。
为了解决这个问题,我的想法仅仅是排序对象的键(包括嵌套在该对象内部的键)。
我该如何实现?
答案 0 :(得分:1)
如OP中所述,对HMAC流程的输入 必须 是确定性的。
但是无论我们希望设置多少Javascript对象元素的顺序,都无法设置。 (我经常看到这个问题。)
答案是对字符串化的字符串本身进行排序。
有关解决方法,请参见json-stable-stringify。
然后将结果字符串输入HMAC方法。无需对它进行base64编码。
答案 1 :(得分:0)
您需要确保双方的信息都是相同的,但是您根本不需要修改或修改该信息
基本上应用此算法
base64(sign(utf8(json message)))
客户端
Stringify:将javascript对象转换为字符串
UTF-8:确保您使用的是已知且固定的编码,例如utf
符号:根据结果消息计算HMAC
base64:将二进制签名转换为base64
发送给客户端json消息和签名
服务器端
从客户端获取原始消息,然后应用步骤2-4。检查签名是否相等