web-dev-qa-db-ja.com

弾力がある城の暗号を使用する私のアプリケーションに対する質問

弾力がある城の暗号化API を使用してアプリケーションを実装しています。ファイルの暗号化にAES-CBCを使用していますが、アプリケーションの開発に関していくつか質問があります。

  1. (セキュリティ上の理由から)静的IVを使用したくないのですが、どうすればよいですか? IVをファイルに追加し、復号化するときにそれを抽出する必要がありますか?
  2. ファイルの暗号化中に、アプリケーションは、暗号化されたバイトが書き込まれる.enc拡張子を持つ新しいファイルを作成します。暗号化が完了すると、暗号化されていないファイルが削除されます。攻撃者が暗号化されていないファイルを回復する可能性があるという懸念がある場合(これはAndroidアプリであるため、基盤となるストレージテクノロジーはフラッシュであり、標準APIを使用してファイルを削除しています)安全な削除機能を実装するか、これに対処する方法は?
  3. ファイルは、PBKDF2によって派生した256ビットキーを使用して暗号化されます。 PBKDF2にはユーザーパスワードのハッシュを使用するソルトが必要ですこれは悪い考えですか?塩はランダムでなければなりませんか?もしそうなら、どのように対処すればよいですか?復号化を実行するためにファイルにソルトを追加する必要がありますか?

弾力がある城に関する良い本はありますか?

1
enigma

aES-CBCを使用します

CBCの代わりに EAXモード を使用する必要があります。暗号化されたデータが(ほとんど労力をかけずに)改ざんされるのを防ぎ、CBCモードに影響を与える特定のエッジケースからユーザーを保護します。さまざまなモードの説明については、 この回答 を参照してください。

これを行うために必要な唯一の変更は、CBCの代わりにEAXを使用することであり、2倍の大きさのキー(AES-128を使用している場合は256ビットキー、またはAES-128を使用している場合は512ビットキー)を使用する必要がありますAES-256を使用しています)。 PBKDF2に任意のサイズのキーを生成させることができますが、出力がハッシュ関数のネイティブ出力サイズであることを確認してください。したがって、512ビットのキーが必要な場合は、PBKDF2-HMAC-SHA512を使用してください。

(セキュリティ上の理由から)静的IVを使用したくないのですが、どうすればよいですか? IVをファイルに追加し、復号化するときにそれを抽出する必要がありますか?

IVは好きなように保管できます。データの先頭に追加するのが一般的です(ファイルを最初から読み飛ばさずに読み取ることができるため、追加は少し簡単です)。 OpenPGP形式 は、他のアプリケーションを使用してファイルの読み取りと書き込みを行うことができるので便利です(この形式は多くの注目を集めているため、おそらくまだ考えていないケースを処理します)。 base64でエンコードされた暗号化データとIVを属性としてJSONファイルを出力するプログラムを作成しました。 XMLを使用できます。データとメタデータを別々のファイルとして配布できます。それは本当にあなた次第です。

暗号化が完了すると、暗号化されていないファイルが削除されます。攻撃者が暗号化されていないファイルを回復する可能性があるという懸念がある場合(これはAndroidアプリであるため、基盤となるストレージテクノロジーはフラッシュであり、標準APIを使用してファイルを削除しています)安全な削除機能を実装するか、これに対処する方法は?

ファイルを削除すると、ファイルシステムは通常、ファイルを削除済みとしてマークするだけなので、他のファイルを上に書き込むことができます。これを修正するには、ファイルを上書きする必要がありますが、特にフラッシュを使用している場合は、ジャーナリングファイルシステムでそれを保証する方法があるかどうかはわかりません(フラッシュコントローラーは通常、ウェアレベリングのためにブロックを移動するため)。ファイルを削除し、デバイスのすべての空き領域を占める巨大なファイルを書き込んでから、そのファイルを削除することで、おそらくこれを行うことができます。

プライベートデータが暗号化されずにディスクに残されないようにする最善の方法は、暗号化されていないディスクにデータを書き込まないことですが、それはプログラムのオプションではないようです。

ファイルは、PBKDF2によって派生した256ビットキーを使用して暗号化されます。 PBKDF2にはユーザーパスワードのハッシュを使用するソルトが必要ですこれは悪い考えですか?

独自のソルトは、システムを多数の脆弱性から保護するため、必ず使用する必要があります。

塩はランダムでなければなりませんか?

必ずしもランダムである必要はありませんが、一意である必要があります。ランダム性は通常、一意の値を取得する最も簡単な方法です。

もしそうなら、どのように対処すればよいですか?復号化を実行するためにファイルにソルトを追加する必要がありますか?

IVを保存するのと同じ方法で塩を保存します。

おそらく、PBKDF2の反復回数も保存したいので、将来的にデフォルトを増やしても、古いファイルを復号化することができます。反復回数が十分に多いことを確認してください。比較のために、iOSはパスワードを保存するときに10,000回の反復でPBKDF2を使用します。プログラムがトースターで実行されていない限り、それよりも低い値を設定する言い訳はありません。

2
Brendan Long