web-dev-qa-db-ja.com

Javaオブジェクトを安全に削除する

Javaオブジェクトを削除するには、文字列ではなく文字配列を使用する必要があります。その内容を安全に消去(他のデータで文字配列を書き換え)できるためです。これはStringオブジェクトに対して実行可能です。

Java=ベースのBlackBerryでは、文字配列としてデータを処理するAPIを見つけることができませんでしたが、文字列を使用する必要があります。したがって、パスワードをオブジェクトを安全に削除するにはどうすればよいですか?

33
smiley

実際には、Javaで文字の配列を実際に「安全に消去」することはできません。 Javaメモリ割り当ては ガベージコレクタ を介して行われます。実際には、物理​​的にメモリオブジェクトを移動するトリッキーなソフトウェアですRAM =定期的に。つまり、「a char[]インスタンス」はいくつかの場所にコピーされ、消去は物理的にそれらの場所の1つでのみ発生します。

その意味で、「安全な削除」は実際にはJavaには存在できません。 Javaを使用する場合は、安全な削除が不要な使用状況であることを確認する必要があります。「安全な削除」は、OSがゼロ化されていないRAMブロックを割り当てる場合に主に必要です(したがって、アプリケーション古いRAM)の抜粋、または仮想メモリ(RAMの一部がハードディスクにコピーされている)が存在する場合。これらはBlackBerryには適用されないので、単純なStringインスタンスで問題ないはずです。

別の言い方をすれば、Stringインスタンスがパスワードに対して上手くいかない場合、単なるパスワードの漏洩よりも大きなセキュリティ問題が発生するということです。結局のところ、一部のデータへのアクセスを保護するためにパスワードを使用しているので、パスワードの「安全な消去」が必要な場合、非常に論理的には、保護されたデータと同様に、すべての「安全な消去」も必要になります。それと。

(私は「安全な消去」の概念の大ファンではないと推測できます。)

43
Thomas Pornin

オブジェクトにパスワードを保存する場合、どのようにして安全に削除できますか?

私が思うに;デバイスにアクセスできる攻撃者がパスワードを回復できないようにするにはどうすればよいですか?

攻撃者が取得したアクセスのレベルによって異なります。

攻撃者が提供する外部APIに限定されている場合(良い仮定ではありません)、Java.security.AccessControllerを使用したアクセス制御で十分です。アクセス制御を正しく(非常に難しい)設計し、攻撃者がアクセス制御をバイパスできない場合、アクセス制御は攻撃者がデータを取得するのを防ぎます。

攻撃者がJava仮想マシン内での操作に制限されているが、API内ではない場合、KeyStore.PrivateKeyEntryでデータを保護する必要があります。このレベルでは、適切な操作に依存できません。データを保護するための設計。Java仮想マシンを使用して保護を提供する必要があります。

攻撃者がオペレーティングシステムに限定されている場合(Java仮想マシンではない)、データを保護することはできません。攻撃者がJava仮想マシンが設計どおりに動作していない場合、攻撃者はJavaセキュリティメカニズムをバイパスできます。

攻撃者がデバイスに物理的にアクセスできる場合、すべての攻撃からデータを保護することは不可能です。このレベルでは、攻撃者はRAM、フラッシュ、ハードウェアモジュールなどに書き込まれているデータを読み取ることができます。

6
this.josh