这是我想要实现的目标。
我有以下格式的有效载荷。
//订购有效负载 - 在接收端观察。
{ " XX":"首先&#34 ;, " YY":"第二&#34 ;, " 11":{ " XX1":" innerVal1&#34 ;, " XX2":" innerVal2"
}
}
由于NSDictionary基本上是无序的,所以当在Xcode的控制台上查看时,它会在字典中对这些键值进行混洗。
在api代理端发出POST请求时,捕获相同的有效负载顺序(如上面的有序dict)。
为确保有效负载未被篡改,我需要对有效负载进行哈希(HMAC)并将其附加到请求中。问题是,当我将有效负载(将NSDict转换为JSON字符串)散列为无序时,就像NSDict属性一样,当它尝试将散列与在中收到的有序负载的散列进行比较时,它不会在代理处进行匹配。请求。
当我做一个' po'在NSDictionary上,这就是我所看到的,每次都是这样。
// unOrdered Payload - 在发送端观察。
//观察持有字典的密钥总是先在字典中看到,然后是其他键值对。
{ " 11":{ " XX2":" innerVal2&#34 ;, " XX1":" innerVal1" }, " YY":"第二&#34 ;, " XX":"首先" }
当有效载荷没有被篡改时,有什么办法可以确保我的哈希值相同吗?
我明白它显然不太可能,我认为值得一试。 我想出了其他逻辑来直接使用键值对进行散列而不是完整的字典。
但由于有效载荷格式可能会随着时间的推移而发生变化,因此我不想继续在客户端和服务器端更改代码。
感谢您抽出时间帮我找到解决方案。
答案 0 :(得分:0)
只需在发送之前散列JSON数据,而不是字典。
NSDictionary
方法将NSJSONSerialization
转换为JSON数据:dataWithJSONObject
。 在服务器端:
如果拥有JSON数据不是一个选项,只需将所有键和值一起哈希,或者如果键不是问题,可能只是哈希值。对密钥进行排序并使用该密钥顺序进行散列顺序。 或者只使用SSL。