Sicheres Löschen von Dateien

AltesEisen

Mitglied
Hallo liebes Forum.
Ich möchte ein Programm entwerfen, das Dateien sicher löscht-. das heißt die Dateien an der richtigen Speicheradresse mit Nullen oder Einsen überschreibt. Nach meinem Wissen werden beim herkömmlichen Löschen unter Windows der Speicher bloß freigegeben aber nicht überschrieben, was das Löschen unsicherer macht.
Ich gehe dabei so vor:
[CODE lang="java" title="Sicheres Löschen"]private static String dateiString = "" ;
private static String f = System.getProperty("file.separator");
private static String filePath = "." + f + "src" + f + "Test.txt";
private static File file = new File(filePath);

inputStream = new FileInputStream(file);

while (( i= inputStream.read()) != -1) {
char c="0";
dateiString = dateiString + c;
}

OutputStream outputStream = null;
try {
outputStream = new FileOutputStream(file);
outputStream.write(dateiString.getBytes());
} catch (Exception e) {
} finally {
outputStream.close();
}

[/CODE]

Macht der Code genau das was er soll oder bin ich auf dem Holzweg?
Danke für Antworten.
 
Du bist auf dem Holzweg.

Mit FileChannel kommst du am nächsten an das Filesystem heran -- allerdings nicht so nahe, um an einer bestimmten Stelle auf dem Speichermedium schreiben zu können.
 
Dein Weg ist extrem dubios.
a) Wieso musst Du denn da einen String mit "0" aufbauen? Wenn Du einen Dateiinhalt überschreiben willst, dann reicht es doch, die Länge abzufragen um dann entsprechende 0en zu schreiben.
b) Wieso denn über ein String und getBytes? Da kommen dann Dinge rein wie Encoding. Und eigentlich willst Du ja auch nicht "0" Zeichen sondern 0x00 Bytes schreiben, oder nicht?
c) Du schreibst eine neue Datei die den gleichen Namen hat, daher ist es sehr gut möglich, dass eben die alte Datei normal gelöscht wird und die neue Datei dann halt mit Deinen "0"er geschrieben wird. Wenn Du den Inhalt der Datei überschreiben willst, dann wäre RandomAccessFile vermutlich das, was Du nutzen willst.

Und generell mit sowas aufpassen - Bist Du sicher, dass Du dies so wirklich haben willst? Der Ansatz ist generell sehr dubios. Wenn Du Daten auf dem Datenträger hast, die kritisch sind, dann würde ich diese nicht unverschlüsselt drauf haben. Und wenn der Datenträger weg gegeben wird, dann würde ich den Datenträger selbst entsprechend löschen - bzw der Datenträger wäre dann eh verschlüsselt gewesen und dann wäre das auch kein Thema.
 
Nullen sind übrigens auch gar nicht mal so sicher, eine Restladung mag noch übrig bleiben. Zufallswerte sind besser geeignet.
Ich würde aber einfach ein bereits existierendes Tool dafür verwenden, gibt ja reichlich davon.
 
Es gibt noch ein weiteres Problem. Auf Solid State Drives lassen sich Dateien nicht so einfach wie auf den guten alten Magnetspeichern überschreiben. Das Betriebssystem weiß einfach nicht so genau wie einzelne Dateien/Teile liegen. Zusätzlich haben SSD einen Schutz vor dem versehentlichen Löschen durch bösartige Software. Die SSD allein legt fest was wie geschrieben wird. Zum sicheren Löschen/Überschreiben auf SSD sind idR. nur die Tools der Hersteller fähig. Es ist aber möglich, dass eine SSD dabei zerstört wird.
Auf einer HDD oder USB-Sticks hast du aber gute Chancen die Dateien zu überschreiben. Trotzdem würde ich eher auf verschlüsselte Dateisystem, -container oder Laufwerke setzen, um zu verhindern, dass gelöschte Daten öffentlich werden.
 
Desweiteren kannst du die java.nio API verwenden, dann ersparst du dir das haendische knuepfen von Pfaden.

Wie die anderen schon sagten, wenn du vom Userspace aus so etwas machen willst, stehst du auf verlorenen Posten. Mindestens musst du dich dafuer im Kernel befinden, in dem Dateisystem-Treiber, ansonsten kannst du einfach keinerlei Aussagen ueber das machen was du gerade schreibst. Und selbst dann kann dir die Hardware was vom blauen Himmel vorluegen.

Auf einer HDD oder USB-Sticks hast du aber gute Chancen die Dateien zu überschreiben. Trotzdem würde ich eher auf verschlüsselte Dateisystem, -container oder Laufwerke setzen, um zu verhindern, dass gelöschte Daten öffentlich werden.

Fuer USB-Sticks gilt das meines Wissens nach nicht, die sind genau so ein Flash-Speicher, und was der Controller macht ist komplett undurchsichtig fuer uns. Fuer "normale" Festplatten ist das schon richtig, gilt aber auch nur noch bedingt. Klar, wenn du so ein dummes Dateisystem wie FAT32 oder NTFS hast dann schon, aber sobald du dich ueber den Schrott hinaus bewegst, ext4, BTRFS, XFS und so weiter, hast du das auch nicht mehr. Journaling, Deduplication, Snapshots, Compression, Encryption, all das wirft dir da einen Stock zwischen die Beine. Und dann gibt es noch Hybrid-Festplatten und den Festplatten-Cache.

Das Thema ist alles andere als simpel geworden in den letzten zwei Jahrzehnten.

Das Betriebssystem weiß einfach nicht so genau wie einzelne Dateien/Teile liegen.

Um jetzt auf Kleinigkeiten herumzureiten, aber das Betriebssystem weisz gar nicht wo die Daten liegen. Selbst wenn die SSD dir einen Sektor mit einer fixen Nummer berichtet, ist das nur Emulation und die Nummer hilft dir gar nichts.

Und als Unterhaltung zu dem Thema, die Geschichte der magischen, chinesischen Festplatte.
 
Zuletzt bearbeitet:

Zurück
Oben