Mi preocupación es que las claves criptográficas y los secretos administrados por el recolector de basura se pueden copiar y mover en la memoria sin cero.¿Cómo puedo asegurarme de que un objeto Java (que contiene material criptográfico) esté en cero?
Como posible solución, es suficiente con:
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();
}
}
// ...
}
EDIT: Tenga en cuenta que mi problema es con respecto no sólo zeroization de la copia oficial (referencia) del objeto, sino también todas las copias obsoletas las El recolector de basura puede haber hecho mientras baraja la memoria para ahorrar espacio y acelerar la eficiencia.
El ejemplo más simple es el marcado y barrido GC, donde los objetos se marcan como 'referenciados' y luego todos esos objetos se copian a otra región. El resto son basura y entonces son recolectados. Cuando se produce la copia, eso puede dejar datos de clave residual que el recolector de basura ya no está gestionando (porque los datos 'oficiales' están en la nueva región).
Una prueba de fuego para esto sería si utiliza una clave en el módulo de cifrado, ponga a cero la clave, luego inspeccione todo el espacio de proceso de JVM, debería no buscar esa clave.
Miré a mi alrededor, pero no encontré la manera de acceder a los datos del GC. Yo respondería que eliminando la referencia entre el atributo y su valor, no hay forma de acceder a él nuevamente, pero no estoy seguro, ya que tenía esta duda. – marionmaiden
Básicamente, no hay forma (actualmente) de hacer lo que quiera con los objetos estándar de Java. – james
No estoy seguro de lo que es el punto. La información está en la memoria _en algún lugar_.si un atacante tiene acceso a la memoria local, entonces estás muy atascado. – james