La mia preoccupazione è che le chiavi e i segreti crittografici gestiti dal garbage collector possano essere copiati e spostati nella memoria senza azzeramento.Come posso garantire che un oggetto Java (contenente materiale crittografico) venga azzerato?
come una possibile soluzione, è sufficiente:
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: Si prega di notare che il mio problema è per quanto riguarda non solo zeroization della copia ufficiale (riferimento) dell'oggetto, ma anche tutte le copie stantii le il garbage collector può averlo fatto mentre mescola la memoria in giro per lo spazio e velocizza l'efficienza.
L'esempio più semplice è il GC mark-and-sweep, in cui gli oggetti sono contrassegnati come "referenziati" e quindi tutti gli oggetti vengono copiati in un'altra regione. Il resto sono quindi spazzatura e quindi vengono raccolti. Quando la copia avviene, ciò potrebbe lasciare dati chiave residui che non vengono più gestiti dal garbage collector (perché i dati "ufficiali" si trovano nella nuova regione).
Un banco di prova per questo sarebbe se si utilizza una chiave nel modulo di crittografia, azzerare la chiave, quindi ispezionare l'intero spazio del processo JVM, si dovrebbe non trovare quella chiave.
Mi sono guardato intorno, ma non ho trovato un modo per accedere ai dati del GC. Risponderei che rimuovendo il riferimento tra l'attributo e il suo valore, non c'è modo di accedervi di nuovo, ma non sono sicuro, come hai avuto questo dubbio. – marionmaiden
Non c'è praticamente alcun modo (al momento) di fare ciò che vuoi con gli oggetti java standard. – james
Non sono proprio sicuro di quale sia il punto. L'informazione è in memoria _somewhere_.se un utente malintenzionato ha accesso alla memoria locale, allora sei praticamente bloccato. – james