Меня беспокоит то, что криптографические ключи и секреты, которыми управляет сборщик мусора, могут копироваться и перемещаться в памяти без обнуления.
В качестве возможного решения достаточно:
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 mark-and-sweep, где объекты помечаются как «ссылающиеся», а затем все эти объекты копируются в другой регион. Остальные же мусор, и поэтому они собираются. Когда происходит копирование, это может привести к тому, что остаточные данные ключа больше не будут управляться сборщиком мусора (поскольку «официальные» данные находятся в новом регионе).
Лакмусовый тест для этого будет, если вы используете ключ в криптомодуле, обнуляете ключ, а затем осмотрите все пространство процесса JVM, вы должны не найти этот ключ.