ios - hmac nsdictionary - 表达 req.body

标签 ios objective-c json node.js express

我正在尝试使用 iOS 应用程序和 Express Node.js 应用程序进行通用 - hmac 验证。

使用给定样本生成 hmac:http://www.jokecamp.com/blog/examples-of-creating-base64-hashes-using-hmac-sha256-in-different-languages/#js

遇到以下问题: 子类化 AFHTTPRequestOperationManager 以获取对 POST: 的访问权限 我想要 hmac nsdictionary parameters

因此将 nsdictionary 转换为 json - hmac it - 并在请求中设置 hmac header 。 在接收端,我使用 crypto-js 和express 来访问 req.body - 和 hmac json 对象。

问题是! - 这些键的顺序不同,即使我强制对 nsdictionary 中的键进行排序,转换后的 json 也不会按顺序排列。

经过几个小时的谷歌搜索,我接受了 json 对象无法以可靠的方式排序。

那么忽略顺序来 hmac 和 nsdictionary 的最佳实践是什么? (我只能对几个键进行 hmac,但这会不太通用,意味着添加字典键需要在 ios 和 express 中更改代码)

仅根据 URI 生成 hmac - 工作正常,但它是一种打开方式:)

更新: 更具体一点。

在应用程序上,我将 nsdictionary 转换为 json,然后计算 json_string 的 hmac

NSDicationary * dic = @{@"key1", "value1",@"key2", "value2"} 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic
                                                       options:(NSJSONWritingOptions)    (prettyPrint ? NSJSONWritingPrettyPrinted : 0)
                                                         error:&error];

NSString * json_str = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]

我做了一个 AFNetworking POST 请求,调用将我的 nsdictionary 作为参数传递:

- (AFHTTPRequestOperation *)POST:NSString *)URLString parameters:(id)parameters   success:(void (^)(AFHTTPRequestOperation *operation,id responseObject))success failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure

在接收器应用程序(node.js/express)上,我从 POST 请求中获取包含 javascript 对象的 ctx.req.body -> 但这里它的顺序与应用程序中的 json 编码字符串不同(而且我还没有找到保留顺序的方法)

因为我不知道 nsdictionary 中有哪些键,所以静态 key-hmac 不起作用。

最佳答案

由于 JSON 只是一个字符串,因此在创建后不存在排序问题。重点是在将字典转换为 JSON 字符串后创建 HMac 值。

在发送方创建 JSON 表示形式,在 HMac 上创建 JSON。将 HMAc 结果与 JSON 一起发送。

在接收方 HMac 上接收到的 JSON 并与接收到的 HMac 值进行比较。

两个 HMac 应该相等。

另一种选择是在每一侧编写一个方法,以相同的预定义顺序检查每个字典元素键/项目,并从中组成一个字符串或数据对象。然后 HMAC 结果。

关于ios - hmac nsdictionary - 表达 req.body,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31813269/

相关文章:

ios - React-Native: 'WEB' 客户端类型不允许使用 Google 自定义方案 URI

iPhone:为我的应用程序的特定区域添加 tabbarcontroller

c# - 如何使用 System.Text.Json 正确反序列化具有 IReadOnlyCollection<T> 的类?

c# - HttpClient PostAsJsonAsync 与 Newtonsoft.Json 不兼容

javascript - 迭代 QuranGlobal JSON 响应

ios - Xcode 字体 : How to know if I need to purchase a license?

ios - 缓存 NSDateformatter 应用程序范围的好主意吗?

ios - 向下滚动时事件指示器 View 消失

iphone - 如何使用 Objective C 在两台机器之间创建远程连接

ios - UIButtons 和 UITextViews 在 Scrollview 中不起作用