IPhoneアプリケーションに静的に暗号化して保存したい情報があります。私はiPhone開発の初心者ですが、CoreDataとビューとの統合方法にそれほど精通していない人もいます。データはJSONですが、SQLITE3データベースやその他のバッキングデータ形式に簡単に入れることができます。 (a)暗号化し、(b)iPhoneビューレイヤーと統合するのが最も簡単な方法を使用します。
ユーザーはアプリを起動するたびにデータを復号化するためにパスワードを入力する必要があります。暗号化の目的は、ユーザーが電話を紛失した場合にデータにアクセスできないようにすることです。
速度上の理由から、データベースの各行の個々のフィールドをそれぞれ暗号化するのではなく、ファイル全体を一度に暗号化および復号化することを好みます。
注:これはではありません質問929744 と同じ考えです。この目的は、ユーザーが手間をかけないようにすることです。またはデータを見る。使用中、データは完全に透過的でなければなりません。
また、私は SQLCipher を使用してデータを格納することをいとわないが、関連する長いビルド/統合プロセスを経由するよりも、iPhone/CoreDataフレームワークにすでに存在するものを使用することを好むでしょう。
コアデータモデルエンティティの個々のプロパティを暗号化するには、それらを transformable properties にしてから、そのプロパティのデータを暗号化および復号化するNSValueTransformerサブクラスを作成します。これは探しているデータベース全体の復号化ではありませんが、データベース全体をメモリに復号化するよりもはるかに少ないメモリフットプリントになります。さらに、復号化を最初からすべてではなく遅延して実行できるため、アプリケーションのロードがはるかに速くなります。使用する暗号化によっては、各エンティティをロードするためのディスク上のデータアクセスは、プロパティの復号化プロセスよりも遅くなると予想することもできるので、プロパティにアクセスするときのパフォーマンスの低下はそれほどありません。
このような変換可能なプロパティは、暗号化/復号化がバックグラウンドで行われている間、通常どおりに読み書きできるため、非常に使いやすくなっています。
暗号化する必要がありますか?新しいiPhone(3G、4、iPad ...)は、デバイス上のすべてのデータを暗号化します。アプリにハッシュ化された単一のソルトパスワードを使用すると、パスワードがないと誰もデータにアクセスできません。データは他のすべてのアプリからサンドボックス化されています。
現在、コアデータストアの暗号化に https://github.com/project-imas/encrypted-core-data を使用しています。これは NSIncrementalStore のカスタム実装です。基本的には、暗号化オプションを持つApple独自の永続ストアに代わるコミュニティです。これは機能するドロップインソリューションです。また、sqliteファイルを取り出して、多くの異なるクライアントで選択したパスコードを使用してそれを復号化することもできます。
実装は100%のカバレッジを持たず、サブクエリ述語などの一部の機能を許可していません。私は最初のPRをリポジトリに提出して、すぐに変更を期待します;-)。 非常に複雑なコアデータアプリでの作業はほぼ完了しています。また、ソースに完全にアクセスできるため、Appleの実装が変更されることを心配する必要なく、SQLiteに直接アクセスできるという利点もあります。
Appleの CustomAtomicStoreSubclass サンプルコードをMacデスクトップアプリケーションで使用できるように適合させることに成功し、ファイルシステムで単一のファイルとして書き込まれる暗号化されたNSBinaryStoreスタイルの永続ストアができました。私のアプローチ:
CustomAtomicStoreSubclass
&CustomAtomicStoreSubclassCacheNode
クラスのソースコードをプロジェクトにコピーして名前を変更しますreadFile
のCustomAtomicStoreSubclass
、metadataForPersistentStoreWithURL:error:
、setMetadata:forPersistentStoreWithURL:error:
、およびsave:
メソッドでバッキングストアの読み取りと書き込みをインターセプトしました。
IPhoneのNSAtomicStoreクラスリファレンスのサブクラス化メモは、Mac OS Xのサブクラス化メモに似ています。おそらく、このアプローチはiPhoneでも機能する可能性があります。
私はこれが古い質問であることを知っていますが、それはまだかなり関連性があり、最近、私はこの問題に自分で取り組む必要がありました。
変換可能なプロパティは潜在的なソリューションですが、大きな欠点であるNSPredicateで機能しないようです。私はCustomAtomicStoreSubclassアプローチを追求しませんでしたが、他の人がそれで成功したかどうか興味があります。
私の懸念は元のポスターと同様であり、最終的には次のことを行いました。
私の場合、ストアは読み取り専用でしたが、これを拡張してストアを書き戻し、暗号化し、暗号化されていないストアをもう一度削除することができます。大きなストアがある場合や、アプリの実行中に暗号化されていないファイルが残っていることを気にしない場合は、いつでも#3をスキップできます。
私が使用していたコアデータファイルは約1MBで、非常に迅速に暗号化/復号化できました。
iOSには、iOS 4以降 データ保護 があり、Core Dataはこれを長い間サポートしてきました。データ保護は、関心のある種類のシナリオに合わせて設計されています。デフォルトでは、iOS 5 API以降で構築されたアプリケーション用のCore Data NSSQLiteStoreType
ファイルにはNSFileProtectionCompleteUntilFirstUserAuthentication
があります。 WWDC 2012セッション ユーザーのデータの保護 は、このトピックをより詳細に説明しており、NSFileProtectionComplete
の使用を推奨しています。 Core Data NSSQLiteStoreType
ストアを開くために使用されるオプションディクショナリにその値を渡すことにより、Core Dataでこれを使用できます。
例:
NSDictionary *storeOptions = @{ NSPersistentStoreFileProtectionKey : NSFileProtectionComplete };
if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self storeURL] options:storeOptions error:&error]){
デバイスセキュリティのより広範なトピックは iOSデバイスセキュリティ でカバーされています。
Trasformablesを使用できます。述語と一緒に使用することはできませんが、さらに悪いことに、使用することもできません。
... = [セルフプリミティブ値フォーキー:@ "暗号化データ"];
述語を使用する場合.
以下を使用してデータを暗号化すると、正常に機能します。
[self setPrimitiveValue:cryptedPsw forKey:@"crypted_data"];
データを暗号化します。 (そして、たとえばシミュレータ上で...そしてプロジェクトバンドルに後で移動してください。)
「Certificate、Key、and Trust Services APIは、対称および非対称暗号化キーの生成、デジタル署名の作成と検証、およびキーとナンスの暗号化のための関数を提供します。CommonCryptoライブラリは、対称暗号化、ハッシュ、およびHMAC操作に使用されます。 Certificate、Key、and Trust Services Reference および CC_crypto(3cc) 詳細については、manページ。 "