web-dev-qa-db-ja.com

Apple NSKeyedArchiverクラスを暗号化せずに使用してスコアデータをローカルに保存する

まず、英語が下手でごめんなさい!

Apple Foundation.framework( https://developer.Apple.com/library/mac/#documentation/)のNSCoderのサブクラスであるNSKeyedArchiverのセキュリティについて質問があります。 Cocoa/Reference/Foundation/Classes/NSKeyedArchiver_Class/Reference/Reference.html

私のアプリでは、Apple Leaderboardを管理するために、Alexander BlunckのABGameKitHelperを使用しました( https://github.com/ablfx/ABGameKitHelper )。このヘルパーは、NSKeyedArchiverクラスでApple Leaderboardにアクセスできない場合(たとえば、ネットワークがない場合など)に、AES暗号化を使用してスコアをローカルに保存します。

ですから、私の質問:攻撃者がNSKeyedArchiverを使用して暗号化せずに書き込まれたデータをデコードし、キーと値のペアを理解できる可能性はありますか?また、スコアデータを変更し、ネットワークに再接続して、ABGameKitHelperからのリーダーボードの自動更新を待機していますか?

よろしくお願いいたします。Alesanco

3
Alesanco

NSKeyedArchiverオブジェクトは、それ自体は何も暗号化しないため、暗号化されていなければ誰でもアーカイブ解除できます。 NSKeyedArchiverが行うことはすべて、ドキュメントからです:

NSCoderの具象サブクラスであるNSKeyedArchiverは、オブジェクト(およびスカラー値)を、ファイルに格納できるアーキテクチャに依存しない形式にエンコードする方法を提供します。オブジェクトのセットをアーカイブすると、各オブジェクトのクラス情報とインスタンス変数がアーカイブに書き込まれます。 NSKeyedArchiverのコンパニオンクラスであるNSKeyedUnarchiverは、アーカイブ内のデータをデコードし、元のセットと同等のオブジェクトのセットを作成します。

つまり、言い換えると、各オブジェクトのコンテンツが元のクラスのIDとともに格納される構造を作成し、元のオブジェクトを後でデコードできるようにします。一種のバイナリXMLと考えてください。

私がお勧めすることは、[NSKeyedArchiver archivedDataWithRootObject:(id)rootObject]によって作成されたNSDataを取得し、任意の方法を使用して暗号化することです。データが本当に秘密の場合は、_AES256_またはBlowfishの使用をお勧めします。使用する必要がある場合は、まずデータを復号化してから、[NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)data]に入れます。

4
Bruno Philipe