我担心由垃圾回收器管理的加密密钥和机密信息可能会在内存中被复制和移动而没有经过清零操作。
作为可能的解决方案,是否仅需要:
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();
}
}
// ...
}
编辑:请注意,我的问题不仅涉及对象的官方(参考)副本的清零,还包括垃圾回收器在为了空间和速度效率而移动内存时可能生成的任何旧副本。
最简单的例子是标记-清除垃圾收集器,其中对象被标记为“引用”,然后所有这些对象都被复制到另一个区域。其余的对象则是垃圾,因此会被收集。当复制发生时,可能会留下残留的关键数据,这些数据不再由垃圾回收器管理(因为“正式”数据位于新区域中)。
此问题的试金石是,如果您在加密模块中使用密钥、将密钥清零,然后检查整个JVM进程空间,您不应该找到该密钥。