重新排列NSDictionary中键的顺序,用于整个字典的加密哈希匹配

时间:2014-07-30 16:42:32

标签: ios objective-c xcode dictionary hash

这是我想要实现的目标。

我有以下格式的有效载荷。

//订购有效负载 - 在接收端观察。

{   " 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":"首先" }

当有效载荷没有被篡改时,有什么办法可以确保我的哈希值相同吗?

我明白它显然不太可能,我认为值得一试。 我想出了其他逻辑来直接使用键值对进行散列而不是完整的字典。

但由于有效载荷格式可能会随着时间的推移而发生变化,因此我不想继续在客户端和服务器端更改代码。

感谢您抽出时间帮我找到解决方案。

1 个答案:

答案 0 :(得分:0)

只需在发送之前散列JSON数据,而不是字典。

  1. 使用NSDictionary方法将NSJSONSerialization转换为JSON数据:dataWithJSONObject
  2. 哈希JSON数据。
  3. 发送了JSON数据和哈希。
  4. 在服务器端:

    1. 哈希收到的JSON数据
    2. 将计算出的哈希值与收到的哈希值进行比较
    3. 如果拥有JSON数据不是一个选项,只需将所有键和值一起哈希,或者如果键不是问题,可能只是哈希值。对密钥进行排序并使用该密钥顺序进行散列顺序。 或者只使用SSL。