2012-05-31 3 views
7

Этот вопрос в основном касается защиты содержимого внутри моего приложения для iOS. Я намерен создать приложение, которое будет загружать большое количество контента (в основном PDF-файлов) по запросу пользователя. Как только эти PDF-файлы будут загружены, они будут храниться локально для удобного автономного доступа.Как защитить цифровой контент (PDF) внутри моего приложения iOS?

Теперь, я не хочу, чтобы кто-то хватался за файл .ipa и удалял файлы PDF. Если это невозможно, возможно ли, что даже если они извлекут PDF-файлы, они НЕ могут его просмотреть или запустить?

Я не уверен, как с этим справиться. Любые предложения приветствуются.

Альтернативой является то, что я могу предоставить файлы, защищенные паролем, пользователю для загрузки. Сохраните связанный пароль в базе данных sqlite. Затем, когда пользователь открывает PDF-файл внутри APP, приложение найдет пароль из базы данных и откроет его без каких-либо подсказок пользователю ввести пароль. Это возможно? Как?

Спасибо и наилучшими пожеланиями

ответ

7

Предположим, что вы каким-то образом скрепили свой PDF-файл, прежде чем положить его на свой сервер загрузки, а приложение дескремблирует его, прежде чем показывать его пользователю.

В приложении, то вы можете выполнить следующие действия:

  1. нагрузки зашифрованного файла PDF в качестве NSData объекта.
  2. Сделайте объект NSMutableData и дешифруйте ваши данные PDF в этот буфер, используя любой алгоритм, который вы выбрали.
  3. Теперь у вас есть полезный PDF-документ в памяти, но только скремблированная версия на диске. Если вам нужно создать CGPDFDocumentRef вы можете сделать это первым созданием DataProvider, используя ваши дескремблируются NSMutableData объект, который беспошлинный мостиком CFData простым броском

Что-то вроде

NSMutableData *data = descrambled PDF; 
CFDataRef myPDFData = (CFDataRef)data; 
CGDataProviderRef provider = CGDataProviderCreateWithCFData(myPDFData); 
CGPDFDocumentRef pdf = CGPDFDocumentCreateWithProvider(provider); 

(Кредит для этого фрагмента идет this answer.)

Поскольку приложение должно иметь возможность дескремблировать PDF-файл, пользователь имеет доступ к приложению и скремблированному файлу PDF, что бы вы ни делали, чтобы предотвратить их извлечение, в основном будет nt к безопасности по неизвестности. Поэтому я бы не стал беспокоиться о сложном алгоритме шифрования. Возможно, вы просто можете сделать что-то простое, например XOR, данные с секретной строкой, скрытой в бинарном приложении.

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

К слову: В духе небытия вы также можете назвать свои загруженные PDF-файлы менее очевидными, чем valuabledocument.pdf. Но реальной безопасности это не так.

Редактировать иллюстрировать ДАННЫЕ XOR-:

Кормите ваш омлет NSData на что-то вроде этого ...

// Fill this out with whatever you want. Use the same string 
// and algorithm to scramble the files on the server. 
static unsigned char secretString[SECRET_STRING_LENGTH]; 

- (NSData *)scrambleOrDescrambleData:(NSData*)input 
{ 
    unsigned char *outputBytes = malloc(input.length); 
    memcpy(outputBytes, input.bytes, input.length); 
    for (int i = 0; i < input.length; i++) 
    { 
     outputBytes[i] = outputBytes[i]^secretString[i % SECRET_STRING_LENGTH]; 
    } 

    NSData *outputData = [[NSData alloc] initWithBytes:outputBytes length:input.length]; 
    free(outputBytes); 

    return outputData; 
} 

Удобная вещь XOR является то, что делает это дважды даст вам обратно ваши исходные данные, поэтому скремблирование и дескремблирование - это один и тот же код.

Я избегаю термина шифрования здесь, потому что это действительно просто запутывание данных, чтобы сохранить его от случайных наблюдателей.

+0

Этот подход выглядит многообещающим. Любая идея, как я могу получить данные XOR PDF? – ssdesign

+0

См. Мое редактирование для примера метода скремблирования/дескремблирования с использованием byte-wise XOR. – Heiberg

+0

Только что проверила первую часть ответа, отлично работает! спасибо @Heiberg – laucel

3

Вы можете защитить ваши файлы путем их шифрования. Посмотрите на ссылку яблока на Protecting Data Using On-Disk Encryption.

+0

Шифрование на диске, как я понимаю, применяется только в том случае, если пользователь использует пароль для блокировки и разблокировки устройства. Поэтому, если устройство разблокировано, и пользователь извлекает файлы PDF, просматривая структуру файла с помощью программного обеспечения, тогда файлы больше не зашифровываются, не так ли? Возможно, мое понимание ошибочно, но я так понял. – ssdesign

+0

Вы можете зашифровать их с помощью какого-либо ключа в приложении и расшифровать PDF, только когда пользователь хочет его просмотреть. – igoris

+0

Привет @igoris вы можете уточнить более подробно, пожалуйста? Спасибо – ssdesign

0

Вы не должны беспокоиться о том, что кто-то задерживает файл .ipa и извлекает PDF-файлы таким образом (так как ваше приложение загружает PDF-файлы, а файлы PDF не поставляются с файлом .ipa).

Существуют, однако, инструменты, позволяющие пользователям просматривать файлы в приложениях, находящихся на их устройствах. Например, выписка iExplorer. Вы должны заметить, что пользователи могут потенциально открыть любой файл - поэтому сохранение пароля в базе данных sqlite не является хорошей идеей. Использование чего-то вроде SFHKeychainUtils было бы более безопасным подходом.

Что касается установки имени пользователя/пароля для PDF идет, вот некоторые примеры кода (вы можете узнать больше из CGPDFContext Reference):

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: @"letMeIn", kCGPDFContextOwnerPassword, @"r3adm3", kCGPDFContextUserPassword, nil]; 
[myPDFDocument writeToFile: @"/some/path" withOptions: options]; 

Я хотел бы также предложить хранить файл, зашифрованный на диске , Вы можете использовать NSData+AES для этого. Вот еще одна реализация NSData+AES. При чтении с диска вы можете хранить незашифрованные NSData в памяти и отображать PDF-файл, вместо того, чтобы читать незашифрованный PDF-файл с диска.

1

Прими взгляд на этой статье: http://aptogo.co.uk/2010/07/protecting-resources/

Деталь автора шифрование приложения расслоение ресурсов, а затем дешифрование файлов в память, так что только зашифрованная версия всегда находится на диске.

Они используют пользовательский NSURLProtocol для шифрования «на лету». Довольно приятное резюме.

Смежные вопросы