2012-07-21 18 views
3

我正在研究iOS和Ruby on Rails应用程序,并需要将从iOS应用程序加密的数据传输到Ruby on Rails应用程序。我的挑战是如何在Objective-C中对数据进行编码,以便我可以在Rails端进行解码。我使用的example in this SO question的方法对数据进行加密,示例代码显示了加密的数据将是什么样子的:如何在iOS Objective-C应用程序和Ruby on Rails之间编码加密数据?

printf("%s\n", [[plain description] UTF8String]); 

它创建如下所示的输出:

< 3fe47b63 bd9a84ab 30dfb1a4 e409b60f>

我面临的挑战是,我需要找到一种方法,跨线得到这个在我可以使用OpenSSL代码中使用像解码方式的Rails应用程序:

def decrypt(data) 
    cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc') 
    cipher.decrypt 
    cipher.key = cipher_key 
    cipher.iv = cipher_iv 
    decrypted_data = cipher.update(data) 
    decrypted_data << cipher.final 
end 

我在想,Base64编码可能是最好的方式去,因为这个数据将最终在JSON请求中的HTTP头。似乎我可以使用Base64.decode64解码Ruby端的数据并将其作为解密数据传递,但我希望有人能够指导我是否真的是最好的方法,无论编码,如何将一个指针变成这样一个NSData对象:

NSData *cipher = [plain AES256EncryptWithKey:key]; 

到这个编码值让它到Rails应用程序。谢谢!

+3

为什么不使用https? – 2012-07-21 22:36:53

+2

由于HTTPS仅对流量进行加密......通过在每个请求上提供签名,对于恶意请求使其看起来像来自iOS应用程序的请求,要困难得多。 – 2012-07-22 01:59:09

回答

4

我最终去了Base64路线。我用NSStringAdditions base64FromData method in another SO answer

+(NSString *)encryptToBase64String:(NSString *)data { 
    NSString *key = <key here>; 
    NSData *plain = [data dataUsingEncoding:NSUTF8StringEncoding]; 
    NSData *cipher = [plain AES256EncryptWithKey:key]; 
    NSString *str = [NSString base64StringFromData:cipher length:[cipher length]]; 
    return str; 
} 

然后加入基部64编码的字符串到RestKit HTTP标头:

[[RKClient sharedClient] setValue:encryptedTimestamp forHTTPHeaderField:@"<encrypted_header_value>"]; 
+3

为什么-1?我没有与我的解决方案结婚,我只是没有得到任何其他答复。 – 2012-07-25 02:47:41

12

可以使用标准的AES加密。下面是使用AES-256-CBC加密和Base64编码的库,你可以在这两个平台上快速使用:

红宝石

https://github.com/Gurpartap/aescrypt

这里是你将如何使用AESCrypt红宝石宝石:

message = "top secret message" 
password = "p4ssw0rd" 

# Encrypting 
encrypted_data = AESCrypt.encrypt(message, password) 

# Decrypting 
message = AESCrypt.decrypt(encrypted_data, password) 

目标C

https://github.com/Gurpartap/AESCrypt-ObjC

这里是你将如何使用AESCrypt Objective-C类:

NSString *message = @"top secret message"; 
NSString *password = @"p4ssw0rd"; 

// Encrypting 
NSString *encryptedData = [AESCrypt encrypt:message password:password]; 

// Decrypting 
NSString *message = [AESCrypt decrypt:encryptedData password:password]; 

祝你好运!

相关问题