2009-10-13 16 views
16

AppleはNSUserDefaultsを使用してすべてのアプリの設定を保存するようお勧めします。しかし、NSUserDefaultsは非常に簡単に編集可能であるようです。これを確保する方法はありますか?私は、編集が不可能になるような方法を探しているわけではなく、ユーザーがアプリケーションの内部変数を変更するように誘惑されないようにするのは難しいです。NSUserDefaultsを保護する方法は?

答えて

-1

for iPhone?彼らはこれらの変数を変更することはできませんが、これを変更するTerminal.appはありません(jailbrokenデバイスを除きますが、これはAppleにとっては問題であり、あなたにとってではありません)。デスクトップアプリケーションの場合は、NSDataを使用してエンコードすることができます。

+0

私はjailbrokenデバイスに懸念しています。 – erotsppa

+0

"これはアップルのための問題ではなく、あなたのためではありません"私はそれが有効だとは思わない。あなたのアプリが貴重なものを保存している場合、誰かが脱獄された携帯電話を標的としたワーム/ウイルスを作って、そのデータをアップして家に郵送するまでに時間がかかるだけです。 – AlBeebe

+0

重要な情報を格納する必要がある場合は、NSUserDefaultsではなくKeychainを使用してください。 –

0

NSUserDefaultsに秘密情報を保存する必要がある場合を除き、正直言って非現実的です。ユーザーはUIに変更できない隠されたものがない限り、実際に自分の設定に行ったり直接編集したりすることはありません(AppleがユーザーにUIを変更することはできませんが、 、変更された場合、安定した有用な効果)。

4

本当に安全なデータをiPhoneのキーチェーンに保存できます。その代わりに、独自の暗号化クラス(アプリケーションの配布を制限することがあります)、またはnsdata、base64などの他のエンコーディングによる難読化があります。

4

NSUserDefaultsには、ユーザーが変更できるようにする必要がある設定のみが含まれています。アプリケーションの内部データはNSUserDefaultsに存在してはいけません。内部データをNSDictionaryに保存し、アプリドキュメントやtmpフォルダ内の別のファイルに書き出します。

NSDictionary* dict = [NSDictionary dictionaryWithObjects:objs forKeys:keys]; 
BOOL succeeded = [dict writeToFile:[self dbFullPathName] atomically:YES]; 
2

あなたはNSUserDefaultsに保存したデータを暗号化するためにAESのような暗号化アルゴリズムを使用してください。アプリに埋め込まれた暗号化キーをハードコードしたり、複数の要素に渡って一連の操作を使用して計算したりすると、保存した値よりも編集のイニシアチブがうまく抑止されます。より簡単にするには、クリアテキストのキーと値を取得し、それらを暗号化してNSUserDefaultsに格納するラッパーメソッドを作成する必要があります。ただし、暗号化/復号化の時間を考慮して、安全ではないストレージよりも遅くなるため、アプリの最も重要な設定オプションにのみ適用することを検討してください。

9

私は、その目的のために使いやすい小さなカテゴリを書いています。 iPhoneとMac OS Xで動作し、無料でMITライセンスを取得しています。あなたはgithubで見つけ出すことができます:SecureUserDefaults

+2

私のアプリケーションでそれがクラッシュします – OMGPOP

+0

@OMGPOP大ファン: –

22

データの一部分(例えば、デフォルトのフォントサイズ)が重要でない場合、それをNSUserDefaultsに格納します。

カジュアルスヌーピング(ユーザーのパスワードなど)から保護する必要がある場合は、キーチェーンに格納します。

ユーザーから保護する必要がある場合(登録コードなど)は、独自の暗号化を展開し、好きな場所にデータを保存する必要があります。

+0

キーチェーンはアンインストール以外の値を保持します。それを念頭において置いておく – xximjasonxx

関連する問題