Шифрование содержимого в скомпилированном приложении iOS (IPA) - PullRequest
10 голосов
/ 02 июня 2011

Поскольку структура IPA - это просто заархивированный файл, содержащий скомпилированные коды и мультимедийное содержимое, такое как изображения и аудио, как я могу защитить содержимое от извлечения и кражи другими пользователями?Есть ли какое-либо шифрование, которое я могу добавить в IPA?

1 Ответ

15 голосов
/ 02 июня 2011

В этом ответе упоминается, что приложение уже зашифровано к тому времени, когда оно попадает на устройства ваших пользователей: Изменяет ли Apple исполняемые файлы приложения iOS в приложениях, представленных в App Store?

Извините, это только двоичный файл приложения. Другие носители не зашифрованы, и нет, нет способа зашифровать .ipa. Вы можете попробовать зашифровать ваши изображения и другие носители в вашей системе, предоставив кучу кода приложения для расшифровки этих ресурсов при запуске приложения, и тогда ваш код дешифрования станет частью двоичного кода зашифрованного приложения. Вы не можете отправить зашифрованный IPA, однако, это должен быть файл, напрямую выводимый из Xcode.

В ответ на ваш комментарий я использовал CommonCrypto. Вам нужно #import <CommonCrypto/CommonCryptor.h>, и реализация, которую я использовал в качестве отправной точки, была этой категорией в NSMutableData .

Простой пример использования вышеуказанной категории:

NSMutableData *imageData = [NSMutableData dataWithContentsOfFile:pathToEncryptedFile];
[imageData decryptWithKey:@"SuperSecretDecryptionKey"];
UIImage *decryptedImage = [UIImage imageWithData:imageData];

ВАЖНОЕ ПРИМЕЧАНИЕ ЗДЕСЬ: ЕСЛИ кто-то должен был запустить утилиту strings на вашем .app на взломанном iphone или даже на iPhone, к которому у них есть доступ к файловой системе через USB, он получит список всех строк, объявленных в вашем приложении. Это включает в себя «SuperSecretDecryptionKey». Поэтому вы можете захотеть использовать целочисленную, с плавающей точкой или другую константу для генерации ключа расшифровки строки на лету, или убедитесь, что строка, используемая для дешифрования, точно такая же, как обычная системная строка, поэтому никто не подозревает, что это истинный ключ. Безопасность через неизвестность в этом случае выгодна.

Обновление: Вы должны проверить AQToolkit для такого рода вещей, это довольно всеобъемлющее.

Чтобы зашифровать / расшифровать *.strings файлы, вы должны каким-то образом зашифровать строки ключа и значения (например, те, которые возвращают вам шестнадцатеричное число или любые буквенно-цифровые символы), а когда вы хотите получить доступ к заданному значению, скажем LicenceNumber, сделайте это:

NSMutableData *keyToRequest = [@"LicenceNumber"
                               dataUsingEncoding:NSUTF8StringEncoding];
[keyToRequest encryptWithKey:@"SuperSecretEncryptionKey"];
NSMutableData *valueToRequest = [[NSBundle mainBundle]
                                 localizedStringForKey:[NSString
                                  stringWithUTF8String:[keyToRequest bytes]]
                                 value:@"No licence"
                                 table:@"EncryptedStringsFile"];
[valueToRequest decryptWithKey:@"SuperSecretDecryptionKey"];
...