1

Javaで、安全に破棄する必要があるオブジェクトがある場合、どのオプションがありますか?

次の点を考慮してください。

a) when : オブジェクトがいつ破棄されるかについて、何らかの保証が必要です。System.gc() を呼び出すことが唯一の/より良いオプションですか?

b) 方法: GC では不十分であり、オブジェクト インスタンスが使用しているメモリが適切に消去されていることを確認する必要があります。最初に、リフレクションを介して内部オブジェクト表現への参照を取得し (文字列内の char[] を取得)、データを上書きできます。ただし、このメソッドには、オブジェクトのタイプごとに実装が必要です。

パスワードと秘密鍵オブジェクトが RAM に残らないようにするためのより良い方法はありますか?

更新: パスワードは一例です。この質問は、オブジェクトを安全に破壊するための一般的な方法に焦点を当てています。BigInteger、PGPPrivateKey、RSAWhatever などを考えてみてください。

4

3 に答える 3

2

免責事項: これはリフレクションを使用しており、最適な方法ではない可能性があります。

ただし、このメソッドには、オブジェクトのタイプごとに実装が必要です。

いいえ、そうではありません。フィールドを反復して破棄することも、オブジェクト グラフ全体をトラバースすることもできます。最初のステップは、プリミティブとプリミティブの配列であり、「シュレッド」しようとしているオブジェクトのフィールドであるオブジェクト参照を無効にします。実際、その最後のステップは、null チェックを使用して再帰的に実行できます。

于 2013-09-09T15:10:59.467 に答える
2

オフ ヒープ メモリを使用するので、ヒープ ダンプには表示されず、コピーもされません (char[] をクリアしても、古いコピーはまだ読み取り可能です)。どこかに別のコピーがあります。

オフ ヒープ メモリは、プリミティブを処理する必要があるため操作が難しくなりますが、その中のすべてを上書きできるため、ゼロにするのは簡単です。

于 2013-09-09T15:11:44.093 に答える
1

ガベージ コレクションに頼ってオブジェクトをメモリから削除することはできません。を呼び出しSystem.gc()ても gc は実行されません。単に「適切に尋ねる」だけです。記憶の中でしばらくぶらぶらすることができます。

char[]標準的なアプローチは、代わりにString次のように、破棄する前にワイプできるオブジェクトを使用することです。

char[] password = <read password from input stream etc>
// check password
Arrays.fill(password, 'x');
// password available for gc, but now wiped

これは、パスワードがメモリ内にある時間を短縮するだけです。それはそれを排除しません。誰かが適切なタイミングでメモリ ダンプを取得した場合、バイトを見つけることができる場合があります。サーバーを適切に保護すれば、そもそもダンプを取得することは困難または不可能になるはずです。

于 2013-09-09T15:12:49.317 に答える