私の懸念は、ガベージコレクターによって管理される暗号化キーとシークレットが、ゼロ化されることなくメモリ内でコピーおよび移動される可能性があることです。
考えられる解決策として、次のことで十分ですか。
public class Key {
private char[] key;
// ...
protected void finalize() throws Throwable {
try {
for(int k = 0; k < key.length; k++) {
key[k] = '\0';
}
} catch (Exception e) {
//...
} finally {
super.finalize();
}
}
// ...
}
編集:私の問題は、オブジェクトの公式(参照)コピーのゼロ化だけでなく、スペースと速度の効率のためにメモリをシャッフルしている間にガベージコレクターが作成した可能性のある古いコピーにも関係していることに注意してください。
最も単純な例は、マークアンドスイープGCです。この場合、オブジェクトは「参照済み」としてマークされ、それらのオブジェクトはすべて別の領域にコピーされます。残りはゴミなので回収されます。コピーが発生すると、ガベージコレクターによって管理されなくなった残りのキーデータが残る可能性があります(「公式」データが新しいリージョンにあるため)。
これに対するリトマス試験は、暗号モジュールでキーを使用し、キーをゼロ化してから、JVMプロセススペース全体を検査する場合、そのキーは見つからないはずです。