2009-05-13 6 views
1

Wie lösche ich Dateien in Java sicher? Ich habe versucht, den Code unter javafaq.nu, aber das Problem ist, Sie können nicht wirklich die Datei auf Windows löschen, sobald es aufgrund this bug zugeordnet wurde.So löschen Sie Dateien sicher in Java

Dann habe ich versucht, nur sysinternals sdelete auf Windows verwenden, aber Sie müssen eine Nutzungsvereinbarung klicken, wenn Sie es das erste Mal verwenden, die ich vermeiden möchte.

+1

sdelete kann, indem Registrierungseintrag HKEY_CURRENT_USER \ Software \ Sysinternals \ SDelete \ ** EulaAccepted automatisiert werden ** zu 1 (REG_DWORD) – Myobis

Antwort

4

Auf einem Journaling-Dateisystem wie NTFS gibt es eigentlich keine Möglichkeit, eine einzelne Datei sicher zu löschen, ohne den gesamten freien Speicherplatz auf dem Laufwerk zu löschen. Das Problem besteht darin, dass die neuen Blöcke (die Sie vermutlich mit zufälligen Daten überschrieben haben) nicht garantiert sind, dass sie sich an der gleichen Stelle auf der Festplatte befinden wie die alten.

Dienstprogramme wie sdelete könnten für Sie arbeiten, aber man könnte diese ausführbare Datei einfach durch eine ersetzen, die diese Methode der Verteidigung nicht vereitelt.

Um Ihre Daten sicher zu halten, besteht die einzige wirkliche Lösung darin, das Laufwerk vollständig zu verschlüsseln.

0

Vielleicht deleteOnExit() auf die Datei?

+1

Das hilft nicht, wenn die Datei zugeordnet ist - sie muss nach dem Beenden des JVM-Prozesses gelöscht werden. –

15

I codiert und versucht, diese Funktion, und es schien zu funktionieren: "Vereinbarung klicken Nutzung" des

public static void secureDelete(File file) throws IOException { 
    if (file.exists()) { 
     long length = file.length(); 
     SecureRandom random = new SecureRandom(); 
     RandomAccessFile raf = new RandomAccessFile(file, "rws"); 
     raf.seek(0); 
     raf.getFilePointer(); 
     byte[] data = new byte[64]; 
     int pos = 0; 
     while (pos < length) { 
      random.nextBytes(data); 
      raf.write(data); 
      pos += data.length; 
     } 
     raf.close(); 
     file.delete(); 
    } 
}