如何在iOS Objective-C应用程序和Ruby on Rails之间编码加密数据?

3
我正在开发一个iOS和Ruby on Rails应用程序,需要加密从iOS应用程序到Ruby on Rails应用程序的数据传输。我的问题是如何在Objective-C中对数据进行编码,以便我可以在Rails端解码。我正在使用这个SO问题中提供的示例作为加密数据的方法,示例代码显示加密后的数据将如下所示:
printf("%s\n", [[plain description] UTF8String]);

这将会创建如下输出:

<3fe47b63 bd9a84ab 30dfb1a4 e409b60f>

我的挑战在于,我需要找到一种方法将其传输到Rails应用程序中,并以一种可解码的方式与OpenSSL代码一起使用,例如:

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应用程序可使用的值。谢谢!


2
由于HTTPS只加密流量...通过在每个请求上提供签名,对于某人恶意发出的请求,使其看起来像是来自iOS应用程序,这样做就更加困难。 - Chris Hart
2个回答

12

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

Ruby

https://github.com/Gurpartap/aescrypt

以下是如何使用AESCrypt Ruby gem:

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

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

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

Objective-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];

祝你好运!


4

最终我采用了Base64方法。我使用了另一个stackoverflow答案中的NSStringAdditions base64FromData方法

+(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;
}

然后将base64编码的字符串添加到RestKit HTTP头中:

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

3
为什么会有负一分?我并不固执于我的解决方案,只是还没有收到其他回复。 - Chris Hart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接