7

この質問は、主に iOS アプリ内のコンテンツの保護に関するものです。ユーザーの要求に応じて多くのコンテンツ (主に PDF ファイル) をダウンロードするアプリを作成する予定です。これらの PDF がダウンロードされると、オフラインで簡単にアクセスできるようにローカルに保存されます。

今、誰も .ipa ファイルを入手して PDF ファイルを抽出することを望んでいません。これが不可能な場合、PDF を抽出しても、表示または実行できない可能性はありますか?

これを処理する方法がわかりません。任意の提案をいただければ幸いです。

別の方法として、パスワードで保護されたファイルをユーザーに提供してダウンロードすることもできます。関連するパスワードを sqlite データベースに保存します。次に、ユーザーが APP 内から PDF を開くと、アプリはデータベースからパスワードを検索し、ユーザーにパスワードの入力を求めるプロンプトを表示せずにそれを開きます。これは可能ですか?どのように?

感謝と敬意

4

4 に答える 4

7

PDF をダウンロード サーバーに置く前に何らかの方法でスクランブルし、アプリがユーザーに表示する前にスクランブルを解除するとします。

その後、アプリで次の操作を実行できます。

  1. スクランブルされた PDF ファイルをNSDataオブジェクトに読み込みます。
  2. オブジェクトNSMutableDataを作成し、選択したアルゴリズムを使用して PDF データをそのバッファーにデスクランブルします。
  3. これで、使用可能な PDF ドキュメントがメモリに保存されましたが、ディスクにはスクランブルされたバージョンしかありません。作成する必要がある場合は、最初に単純なキャストによって無料でブリッジされるCGPDFDocumentRefデスクランブルされたオブジェクトを使用してデータプロバイダーを作成することでそれを行うことができますNSMutableDataCFData

何かのようなもの

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

(そのスニペットのクレジットはこの回答にあります。)

アプリは PDF のスクランブルを解除できる必要があり、ユーザーはアプリとスクランブルされた PDF ファイルの両方にアクセスできるため、抽出を防ぐために行うことは、基本的に不明瞭によるセキュリティになります。したがって、複雑な暗号化アルゴリズムを気にする必要はありません。おそらく、アプリのバイナリに隠されている秘密の文字列を使用してデータを 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 の便利な点は、2 回実行すると元のデータが返されるため、スクランブルとデスクランブルは同じコードになることです。

ここでは暗号化という用語を避けています。これは実際にはデータを難読化して、偶然の観察者から守るためです。

于 2012-06-14T10:10:12.247 に答える
3

ファイルを暗号化することでファイルを保護できます。オンディスク暗号化を使用したデータの保護に関するApple のリファレンスを参照してください。

于 2012-05-31T08:41:16.670 に答える
1

この記事を見てください:http://aptogo.co.uk/2010/07/protecting-resources/

作成者は、アプリバンドルリソースの暗号化と、ファイルをメモリに復号化して、スクランブルされたバージョンのみがディスクに存在するようにする方法について詳しく説明します。

その場で暗号化するためにカスタムNSURLProtocolを使用します。かなりいい要約。

于 2013-02-26T16:04:24.267 に答える
0

誰かが .ipa ファイルを入手してそのように PDF を抽出することを心配する必要はありません (アプリが PDF をダウンロードし、それらの PDF は .ipa ファイルに同梱されていないため)。

ただし、ユーザーがデバイス上のアプリ内のファイルを参照できるようにするツールがあります。たとえば、iExplorerをチェックアウトします。ユーザーは任意のファイルを開く可能性があることに注意してください。そのため、パスワードを sqlite データベースに保存することはお勧めできません。SFHKeychainUtilsのようなものを使用すると、より安全なアプローチになります。

PDF のユーザー名/パスワードの設定に関する限り、サンプル コードを次に示します (詳細については、CGPDFContext リファレンスを参照してください)。

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

暗号化されたファイルをディスクに保存することもお勧めします。NSData+AESを使用してこれを行うことができます。これはNSData+AESの別の実装です。ディスクから読み取る場合、暗号化されていない NSData をメモリに保持し、ディスクから暗号化されていない PDF を読み取る代わりに、そこから PDF を表示できます。

于 2012-06-20T23:48:48.720 に答える