你好吗?
我试图使用RNCryptor加密iOS设备和and服务器之间的事务。为此,我在iOS和PHP上使用iOS,并使用AFNetworking从iOS到WebServer进行通信。
在将数据解析为JSON对象之前,如何解密从AFNetworking收到的数据?
合成,我有:
从iOS到PHP:我可以在使用数据之前对其进行解密。
从PHP到iOS: AFNetworking在使用数据之前不对数据进行解密。
我的PHP代码是这样的:
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代码是这样的:
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
我稍微修改了代码,现在我可以得到如下结果:
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);
}];有人对如何创建自动解密的响应序列化程序有提示吗?
发布于 2014-06-18 23:31:46
在响应头中,您会说返回的数据将是JSON ('Content-type: application/ JSON '),但事实并非如此,它只是一堆曾经是JSON的加密字节,在解密后可以再次加密。
要么更改标题(最好),要么使用一个http请求,该请求看不到标题并自动尝试反序列化JSON。查看AAFNetworking,看看是否有这样的选项或其他方法只返回rad数据。
您需要获取原始数据,解密它,然后反序列化它。
发布于 2014-06-19 13:46:49
好的,找到了解决办法,用一种很好的方式解决了。我已经创建了一个处理解密的AF响应序列化程序。
RNCryptResponseSerializer.h
//
// 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
@endRNCryptResponseSerializer.m
//
// 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:上的
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);
}];https://stackoverflow.com/questions/24296341
复制相似问题