我担心的是垃圾收集器管理的加密密钥和机密可能会在内存中复制和移动而无需归零。
作为一种可能的解决方案,是否足以:
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();
}
}
// ...
}
编辑:请注意,我的问题不仅与对象的官方(引用)副本的归零有关,还与垃圾收集器在为空间和速度效率洗牌时可能制作的任何陈旧副本有关。
最简单的例子是mark-and-sweep GC,其中对象被标记为“引用”,然后所有这些对象都被复制到另一个区域。其余的都是垃圾,所以它们被收集起来。当复制发生时,可能会留下垃圾收集器不再管理的剩余密钥数据(因为“官方”数据在新区域中)。
对此的试金石是,如果您在加密模块中使用密钥,将密钥归零,然后检查整个 JVM 进程空间,您应该找不到该密钥。