首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AFNetworking + RNCryptor -在解析JSON之前解密数据

AFNetworking + RNCryptor -在解析JSON之前解密数据
EN

Stack Overflow用户
提问于 2014-06-18 23:01:38
回答 2查看 1.2K关注 0票数 2

你好吗?

我试图使用RNCryptor加密iOS设备和and服务器之间的事务。为此,我在iOS和PHP上使用iOS,并使用AFNetworking从iOS到WebServer进行通信。

在将数据解析为JSON对象之前,如何解密从AFNetworking收到的数据?

合成,我有:

  • Yii框架,服务器端,PHP
  • AFNetworling,客户端,目标-C
  • RNCryptor,双方

从iOS到PHP:我可以在使用数据之前对其进行解密。

从PHP到iOS: AFNetworking在使用数据之前不对数据进行解密。

我的PHP代码是这样的:

代码语言:javascript
复制
RNCryptorHelper::init();
$encryptor = new \RNCryptor\Encryptor;

$data['Model1'] = Model1::model()->findAll();
$data['Model2'] = Model2::model()->findAll();

// EDITED TO REMOVE THIS HEADER
// header('Content-type: application/json');
echo $encryptor->encrypt(CJSON::encode($data), Yii::app()->params['cryptPassword']);
Yii::app()->end();

输出类似这样的内容的

AwFQ9+OfsHyXcSPynCrtveF7MQupQ+urd/VYeNMmt6OMxd6MhsDz4nxapvS1kVEHHbBZ4xLHqN7hTUDZos1LTWhB/CyeYoWpZSDhyFeHu9wNlHcRie6KTaHv/h14krvfb2/GHMt3GhIFqnyo7UKy/d06

我的目标-C代码是这样的:

代码语言:javascript
复制
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

[manager GET:[NSString stringWithFormat:@"%@/Sync", URL_ROOT]
  parameters:nil
     success:^(AFHTTPRequestOperation *operation, id responseObject) {

         NSLog(@"%@", [RNDecryptor decryptData:responseObject withPassword:CRYPT_PASSWORD error:nil]);

     }
     failure:^(AFHTTPRequestOperation *operation, NSError *error) {
         NSLog(@"Error: %@", error);
     }];

输出以下错误的

错误Domain=NSCocoaErrorDomain Code=3840“操作无法完成。(可可错误3840。)(JSON文本没有以数组或对象和选项开头,以允许不设置片段。)UserInfo=0x15681970 {NSDebugDescription=JSON文本没有以数组或对象和选项开头,以允许不设置片段。}

谢谢你的帮助!!

编辑1

我稍微修改了代码,现在我可以得到如下结果:

代码语言:javascript
复制
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

[manager GET:[NSString stringWithFormat:@"%@/Sync", URL_ROOT]
  parameters:nil
     success:^(AFHTTPRequestOperation *operation, id responseObject) {

         NSData *decryptedData = [RNDecryptor decryptData:[[NSData alloc] initWithBase64EncodedData:responseObject options:NSDataBase64DecodingIgnoreUnknownCharacters]
                                             withPassword:CRYPT_PASSWORD
                                                    error:nil];

         id json = [NSJSONSerialization JSONObjectWithData:decryptedData
                                                   options:kNilOptions
                                                     error:nil];

     }
     failure:^(AFHTTPRequestOperation *operation, NSError *error) {
         NSLog(@"Error: %@", error);
     }];

有人对如何创建自动解密的响应序列化程序有提示吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-18 23:31:46

在响应头中,您会说返回的数据将是JSON ('Content-type: application/ JSON '),但事实并非如此,它只是一堆曾经是JSON的加密字节,在解密后可以再次加密。

要么更改标题(最好),要么使用一个http请求,该请求看不到标题并自动尝试反序列化JSON。查看AAFNetworking,看看是否有这样的选项或其他方法只返回rad数据。

您需要获取原始数据,解密它,然后反序列化它。

票数 1
EN

Stack Overflow用户

发布于 2014-06-19 13:46:49

好的,找到了解决办法,用一种很好的方式解决了。我已经创建了一个处理解密的AF响应序列化程序。

RNCryptResponseSerializer.h

代码语言:javascript
复制
//
//  RNCryptResponseSerializer.h
//  Professor Virtual
//
//  Created by Caio Henrique Galli dos Santos on 18/06/14.
//  Copyright (c) 2014 sys10. All rights reserved.
//

#import "AFURLResponseSerialization.h"

@interface RNCryptResponseSerializer : AFJSONResponseSerializer

@end

RNCryptResponseSerializer.m

代码语言:javascript
复制
//
//  RNCryptResponseSerializer.m
//  Professor Virtual
//
//  Created by Caio Henrique Galli dos Santos on 18/06/14.
//  Copyright (c) 2014 sys10. All rights reserved.
//

#import "RNCryptResponseSerializer.h"
#import "RNDecryptor.h"

@implementation RNCryptResponseSerializer

#pragma mark - AFURLResponseSerialization

- (id)responseObjectForResponse:(NSURLResponse *)response
                           data:(NSData *)data
                          error:(NSError *__autoreleasing *)error
{

    NSData *dataFromBase64 = [[NSData alloc] initWithBase64EncodedData:data options:NSDataBase64DecodingIgnoreUnknownCharacters];
    NSData *dataDecrypted = [RNDecryptor decryptData:dataFromBase64
                                        withPassword:CRYPT_PASSWORD
                                               error:nil];

    return [super responseObjectForResponse:response data:dataDecrypted error:error];

}

@end

我的AFHTTPRequestOperationManager:上的

代码语言:javascript
复制
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [RNCryptResponseSerializer serializer];

[manager GET:[NSString stringWithFormat:@"%@/Sync", URL_ROOT]
  parameters:nil
     success:^(AFHTTPRequestOperation *operation, id responseObject) {

         // Decrypted responseObject
         responseObject;

     }
     failure:^(AFHTTPRequestOperation *operation, NSError *error) {
         NSLog(@"Error: %@", error);
     }];
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24296341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档