2013-02-15 3 views
6

コアデータの暗号化に関する質問があります。私はいくつかの機密ユーザーデータをCore Data SQLiteデータベースに保存しています。クリティカルな値はすべての変換可能なもので、私はAES256を使って、それらを「オンザフライで」暗号化し、解読しています。暗号化キーは、ユーザーが選択したパスワードのSHA512ハッシュです。これはこれまでのところうまくいきます。コアデータの暗号化

ここでユーザーのパスワードについてです。ユーザーがアプリを起動すると、彼はパスワードを尋ねられます。パスワードはSHA512でハッシュされ、iOSキーチェーンに保存されます。書き込み操作または読み取り操作ごとに、NSValueTransformerはキーチェーンからパスワードを取得します。アプリケーションが閉じている場合は、キーチェーンからパスワードハッシュを削除します。

私のコアデータデータベースには、乱数値が0の特別なエンティティがありますが、これは単なる値です。ユーザーが正しいパスワードを入力したかどうかをテストするには、このエンティティを取得して番号を読み取ります。それが=ならば! 0、私は解読が失敗するとNSValueTransformerは常に0を返すので、パスワードが正しいことを知っています。

今私の実際の質問:これは暗号化の良いアプローチだと思いませんか?入力されたパスワードが正しいかどうかを調べるにはどうすればよいでしょうか?

NSValueTransformerがキーチェーンに常にアクセスしなければならないため、アプリケーションの実行中にキーチェーンにパスワードハッシュを格納するとすべての処理が遅くなります。パスワードハッシュをメモリに保存するだけで十分安全なので、アプリが終了したら削除されますか?

答えて

7

パスワードのハッシュを使用しないでください。ハッシュは高速に設計されているため、(比較的)簡単な攻撃が可能です。 PBKDF2のようなkey derivation functionを使用してください。

パスワードから直接派生したキーを暗号化キーとして使用しないでください。ユーザーがパスワードを変更した場合、すべてのデータを再暗号化する必要があり、バックアップが無駄になります。ランダムに生成された暗号化キーを使用して、そのパスワードに基づいてキー暗号化キーで暗号化します。

ハッシュをメモリに保持するのではなく、キーチェーンに格納することについてはわかりません。これを最後に調べたところ、キーチェーンを解読するのは簡単でした。また、実行中のアプリのメモリを読み取ることができるすべての攻撃者は、キーチェーンのアクセスまたは復号化されたデータをスヌーピングする可能性が非常に高いでしょう。メモリに残しておき、アプリがバックグラウンドなどで中断した場合は、メモリを消去してください。これは明らかに、復号化されたデータのすべてについても当てはまります。

[EDIT:@JeffLockhartは、マスター暗号化キーのための手順を明確にする]あなたは、キーAを生成するためにSecRandomCopyBytesを使用しての使用のためApple's CryptoExcerciseを見ることができるのは、キーA.それを呼びましょう、あなたのデータを暗号化するために、あなたは、ランダムなキーを生成 を例。キーAを使用してユーザーデータを暗号化します。キーAを保存するには、キーAを2番目のキーBで暗号化する必要があります。急速なブルートフォースまたは辞書攻撃のために、パスワードを直接キーBとして使用しないでください。だからあなたはPBKDFでパスワードから鍵を派生させます。this のように答えます。キーAをキーBで暗号化します。 CCCryptを使用してください。暗号化された鍵Aと鍵Bを得るために使用された鍵を保存します。 解読するには、ユーザーがパスワードを入力し、パスワードと塩を使用してキーBを派生させます。派生キーBを使用して鍵Aを解読します。彼らは暗号化されたSQLite-データベースを使用しているNSIncrementalStoreサブクラスを実装している

Secure Incremental Store

+0

「パスワードに基づいて鍵の暗号化キーで暗号化したランダムに生成された暗号化キーを使用する」という意味で説明できますか?私はコアデータストアのいくつかのフィールドを暗号化することを検討しており、暗号化を行うための鍵を生成するためのベストプラクティスを探しています。私はそれが変更することができますので、パスワードに基づいて意味をなさないことに同意します。 –

1

あなたはこれを見て持つことができます。これはAppleのSQLite Storeの代替品です。値札も付いてくる。

+1

「値札付き」 - あなたは冗談ではありません! – kball