Предположим, что вы каким-то образом скрепили свой PDF-файл, прежде чем положить его на свой сервер загрузки, а приложение дескремблирует его, прежде чем показывать его пользователю.
В приложении, то вы можете выполнить следующие действия:
- нагрузки зашифрованного файла PDF в качестве
NSData
объекта.
- Сделайте объект
NSMutableData
и дешифруйте ваши данные PDF в этот буфер, используя любой алгоритм, который вы выбрали.
- Теперь у вас есть полезный 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 является то, что делает это дважды даст вам обратно ваши исходные данные, поэтому скремблирование и дескремблирование - это один и тот же код.
Я избегаю термина шифрования здесь, потому что это действительно просто запутывание данных, чтобы сохранить его от случайных наблюдателей.
Этот подход выглядит многообещающим. Любая идея, как я могу получить данные XOR PDF? – ssdesign
См. Мое редактирование для примера метода скремблирования/дескремблирования с использованием byte-wise XOR. – Heiberg
Только что проверила первую часть ответа, отлично работает! спасибо @Heiberg – laucel