7

CoreDataの暗号化について質問があります。機密性の高いユーザーデータをCoreDataSQLiteデータベースに保存しています。重要な値はすべて変換可能であり、私はAES256を使用して、すべての値の個別のIVを含め、「オンザフライ」でそれらを暗号化および復号化します。暗号化キーは、ユーザーが選択したパスワードのSHA512ハッシュです。これは今のところ非常にうまく機能しています。

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

私のCoreDataデータベースには、唯一の値として乱数!=0を持つ特別なエンティティがあります。ユーザーが正しいパスワードを入力したかどうかをテストするために、このエンティティを取得して番号を読み取ります。=の場合!0、復号化が失敗するとNSValueTransformerは常に0を返すため、パスワードが正しいことを知っています。

さて、私の実際の質問:これは暗号化の良いアプローチだと思いますか?入力したパスワードが正しいかどうかを他にどのようにテストしますか?

NSValueTransformerは常にキーチェーンにアクセスする必要があるため、アプリの実行中にパスワードハッシュをキーチェーンに保存すると、すべてが遅くなるのではないかと少し心配しています。パスワードハッシュをメモリに保持するだけで十分に安全なので、アプリを閉じると削除されますか?

4

2 に答える 2

7

パスワードのハッシュを使用しないでください。ハッシュは高速になるように設計されているため、ブルート フォース攻撃を (比較的) 簡単に行うことができます。PBKDF2のようなキー導出関数を使用します。

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

ハッシュをメモリに保持するだけでなく、キーチェーンに格納することについてはよくわかりません。前回これを調べたとき、キーチェーンを解読するのは比較的簡単でした。また、実行中のアプリのメモリを読み取ることができるすべての攻撃者は、キーチェーン アクセスまたは復号化されたデータをスヌープできる可能性が高くなります。メモリに保持し、アプリがバックグラウンドなどでサスペンドした場合は必ずメモリを消去してください。これは、復号化されたデータのすべての部分にも当てはまります。

[編集: マスター暗号化キーの手順を明確にする @JeffLockhart] データを暗号化するランダム キーを生成します。これをキー A と呼びましょう。SecRandomCopyBytesを使用してキー A を生成できます。使用例については、Apple の CryptoExcerciseを参照してください。キー A を使用して、ユーザー データを暗号化します。キー A を保存するには、キー A を 2 番目のキー B で暗号化する必要があります。総当たり攻撃または辞書攻撃が高速であるため、パスワードをキー B として直接使用しないでください。したがって、この stackoverflowの回答のように、PBKDFを使用してパスワードからキーを導出します。次に、 CCCryptなどを使用して、キー A をキー B で暗号化します。. 暗号化されたキー A と、キー B を導出するために使用されたソルトを保存します。復号化するには、ユーザーがパスワードを入力し、パスワードとソルトを使用してキー B を導出します。派生キー B を使用してキー A を復号化します。

于 2013-03-25T22:10:40.287 に答える