【问题标题】:How to encode encrypted data between iOS Objective-C app and Ruby on Rails?如何在 iOS Objective-C 应用程序和 Ruby on Rails 之间对加密数据进行编码?
【发布时间】:2012-07-20 14:31:35
【问题描述】:

我正在开发一个 iOS 和 Ruby on Rails 应用程序,需要将数据从 iOS 应用程序加密传输到 Ruby on Rails 应用程序。我的挑战是如何以我可以在 Rails 端解码的方式对 Objective-C 中的数据进行编码。我使用example in this SO question作为加密数据的方法,示例代码显示了加密数据的样子:

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

创建的输出如下所示:

我的挑战是,我需要找到一种方法将其通过网络传输到 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 应用程序。谢谢!

【问题讨论】:

  • 因为 HTTPS 仅对流量进行加密...通过在每个请求上提供签名,某人恶意发出请求使其看起来像是来自 iOS 应用程序的难度要大得多。跨度>

标签: objective-c ios ruby encryption aes


【解决方案1】:

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

红宝石

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)

目标-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];

祝你好运!

【讨论】:

    【解决方案2】:

    我最终选择了 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;
    }
    

    然后将 base 64 编码的字符串添加到 RestKit HTTP 标头:

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

    【讨论】:

    • 为什么是-1?我没有接受我的解决方案,只是没有得到任何其他回应。
    猜你喜欢
    • 1970-01-01
    • 2018-12-27
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2017-04-12
    相关资源
    最近更新 更多