【发布时间】:2019-02-11 16:58:50
【问题描述】:
我有一个如下所示的 JavaScript 对象:
Const data = {
x: 1,
y: 2,
z: 3
a: 4,
b: 5,
c: 6
};
我们的 Angular 6 应用程序中有一个签名服务,它对该对象进行字符串化,对字符串进行哈希处理,然后为其附加签名。然后将其保存到 Firestore 数据库。数据库喜欢按字母顺序排列属性,所以它最终看起来像这样:
{
a: 4,
b: 5,
c: 6,
x: 1,
y: 2,
z: 3
}
当我们从数据库中检索此对象并尝试验证签名时,它失败了。它失败了,因为当您对 this 对象进行字符串化时,属性的字母顺序会导致与我们签名时不同的字符串。这会导致与原始签名不匹配的不同哈希值。
我们目前对这个问题的解决方案是我们在代码中按字母顺序写出属性的顺序,但我们想证明这一点(例如,如果另一个开发人员出现并在底部添加一个属性,说 d,没有意识到它应该是按字母顺序排列的)。一位同事告诉我,有一些方法可以告诉 Javascript 根据自己的算法对属性进行排序。如果我们能做到这一点,那么我们会在字符串化、散列和签名之前根据该算法对属性进行排序,然后当我们从数据库中检索对象时,做同样的事情:根据 Javascript 的算法对属性进行排序,字符串化、哈希和验证。
有谁知道这个 Javascript 排序是什么以及怎么做?
【问题讨论】:
-
没有。如果您需要保证顺序,请使用数组
-
为什么不存储完整的 JSON 字符串呢?
-
通常我把它变成
key : value对象的数组,然后按值排序
标签: javascript properties