【问题标题】:AFNetworking + RNCryptor - decrypt data before JSON parseAFNetworking + RNCryptor - 在 JSON 解析之前解密数据
【发布时间】:2014-08-09 09:15:47
【问题描述】:

你好吗?

我正在尝试使用 RNCryptor 来加密我在 iOS 设备和网络服务器之间的交易。为此,我在 iOS 和 PHP 上使用 RNCryptor,并使用 AFNetworking 从 iOS 到 WebServer 进行通信。

如何在从 AFNetworking 接收到的数据被解析为 JSON 响应对象之前对其进行解密?


为了综合,我有:

  • Yii 框架,服务器端,PHP
  • AFNetworling,客户端,Objective-C
  • RNCryptor,两侧

从 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/d6


我的 Objective-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);
     }];

输出以下错误:

Error Domain=NSCocoaErrorDomain Code=3840“操作无法完成。(Cocoa 错误 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);
     }];

任何人都知道如何创建一个自动解密的响应序列化程序?

【问题讨论】:

    标签: objective-c encryption yii afnetworking-2 rncryptor


    【解决方案1】:

    好的,找到了解决方案并以一种漂亮的方式解决了。 我创建了一个处理解密的 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
    
    @end
    

    RNCryptResponseSerializer.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);
         }];
    

    【讨论】:

      【解决方案2】:

      您在响应标头中说返回的数据将是 JSON('Content-type: application/json')但它不是,它只是一堆加密的字节,曾经是 JSON,解密后可以再次.

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

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

      【讨论】:

      • 就是这样。我将其更改为接收原始数据并对其进行解密。现在我正在研究如何创建一个 Response Serializer 来处理它。
      猜你喜欢
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-16
      相关资源
      最近更新 更多