Werden die Dateien wirklich sicher gelöscht?

  • VB.NET
  • .NET (FX) 4.0

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Mr. Johny.

    Werden die Dateien wirklich sicher gelöscht?

    Hallo, ich habe mal eine frage an diejenigen die sich mit intensiver Datenwiederherstellung auskennen. Unter "Dateien sicher löschen" versteht man ja das diese Dateien mehrfach überschrieben und darauffolgend gelöscht werden. Dies nun Theoretisch in VB umzusetzen ist nicht schwer, bei mir sieht die Funktion folgend aus:

    VB.NET-Quellcode

    1. Public Function SafeEraser(ByVal filepath As String, ByVal repeat As Integer, ByVal delete As Boolean)
    2. Dim r As New Random
    3. Dim sb As New StringBuilder
    4. Dim abc = "abcdefghijklmnopqrstuvwxyz"
    5. Try
    6. For i = 0 To repeat
    7. Dim idx As Integer = r.Next(0, abc.Length)
    8. Dim filesize As New FileInfo(filepath)
    9. Dim fsize = CInt(Int(filesize.Length))
    10. Dim fstream As New StreamWriter(filepath)
    11. sb.Append(abc.Substring(idx, 1))
    12. For o = 0 To CInt(fsize)
    13. fstream.Write(sb.ToString)
    14. Next
    15. sb.Clear()
    16. fstream.Close()
    17. Next
    18. Catch ex As Exception
    19. End Try
    20. Try
    21. If delete = True Then
    22. File.Delete(filepath)
    23. Else
    24. End If
    25. Catch ex As Exception
    26. MsgBox("File could not be deleted: " & ErrorToString(), MsgBoxStyle.Critical)
    27. End Try
    28. End Function


    Meine Frage nun: Ist diese Methode wirklich sicher und ist diese Funktion bzw. dieses vorgehen so korrekt? Funktionieren tut es, da ich es mit der Wiederherstellungssoftware Recuva getestet habe, Recuva konnte die Originaldatei nicht wiederherstellen. Recuva ist allerdings eine einfache Anwendung und nicht mit der Profianwendungen die z.b. Behörden oder Geheimdienste zu vergleichen. Hat jemand in diesem Bereich erfahrungen?

    MfG Mr. Johny

    Mr. Johny schrieb:

    so korrekt?
    Ich könnte mir vorstellen, dass es sicherer wäre, wenn abwechselnd die Bytes 0 und 255 geschrieben würden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Mr. Johny schrieb:

    abwechselnd
    Ja.
    Eine Runde 0, eine Runde &HFF,
    vielleicht noch
    eine Runde &H55 und &HAA.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich könnte mir vorstellen, dass dir die Festplatte bzw, der Treiber da nen Strich durch die Rechnung machen könnte. Letztlich ist es ja der Festplatte überlassen, wo etwas geschrieben wird. Ich könnte mir vorstellen, dass du von 0 bis n mal an verschiedenen Orten auf der Platte etwas schreibst, ohne das Original wirklich richtig zu überschreiben. Lediglich der MBR oder die GPT wird halt ständig angepasst. Ist aber nur eine Vermutung.

    EaranMaleasi schrieb:

    an verschiedenen Orten
    Wenn die Datei binary read-writwe geöffnet wird, schreibst Du genau dahin, wohin es gehört.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ja EaranMaleasi daran denke ich auch, da Windows ja das nichtsnütz Dateisystem NTFS nutzt da die Daten willkürlich auf die Platte geschrieben werden (kleines Beispiel im Bild). Allerdings frage ich mich ob bei Datenänderungen das Dateisystem nun wieder willkürlich die Daten auf die Platte schreibt oder ob sie die Blöcke wieder nutzt die für diese Datei definiert wurden, also diese Blöcke beibehält. Wenn NTFS die Blöcke beibehält dann werden die Daten sicher gelöscht, falls nicht denn könnte man diese Wiederherstellen. Das frage ich mich also wie dass das Dateisystem regelt.
    Bilder
    • Unbenannt-1.jpg

      51,8 kB, 300×300, 90 mal angesehen
    Eine einzelne Datei lässt sich nicht sicher löschen.
    Nur die Blöcke, die die Datei momentan verwendet.
    Die Fragmente dieser Datei, die auf der Platte von früheren Versionen hinterlassen wurden, triffst du nicht.
    Und selbst, wenn du manuell nichts mit dieser Datei gemacht hast, sind im Hintergrund so viele technische Prozesse am Laufen, die Dateien an andere Plätze verschieben, dass du immer irgendwelche Datenreste finden wirst.

    Wenn es sich tatsächlich um kritische Daten handelt, hilft nur, die Platte komplett mehrfach überschreiben.
    Oder du verwendest Verschlüsselungsverfahren (Bitlocker, Veracrypt...).
    Dann sind die Daten zumindest vor fremden Benutzern sicher, auch die nicht gelöschten.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Da in #1 das Medium nicht genannt wurde, gehe mal vom schlimmstmöglichen Fall aus: einer SSD.
    Jede Schreibaktion geht auf frische Seiten/Blöcke und die Zeiger in der MFT (bei NTFS) werden umgebogen.
    Die vorher genutzten Blöcke stehen dann so lange mit ihren Daten herum, bis sie mal irgendwann mit neuen Daten gefüllt werden.
    Mit ein wenig Fleiß könnte man die scheinbar gelöschten Daten also wieder herstellen. Auch mehrfaches Überschreiben hilft da nicht.
    An manchen Tagen gibt es zu allem Überfluss auch noch Ärger!
    Also wenn ich das richtig verstehe dann werden die Daten tatsächlich überschrieben sofern die überschriebenen Bytes exakt den Bytes der Datei entsprechen? Wie es dort an dem Codebeispiel gezeigt wird:

    C#-Quellcode

    1. using(var fs = new System.IO.FileStream(@"m:\delme.zip",
    2. FileMode.Open,
    3. FileAccess.Write,
    4. FileShare.None))
    5. {
    6. var zeros = new byte[fs.Length];
    7. fs.Write(zeros, 0, zeros.Length);
    8. }



    //EDIT

    Ich habe mir jetzt mal eine PDF durchgelesen vom Arbeitskreis „Technische und organisatorische Datenschutzfragen“, dort wird vom US-Verteidigungsministerium bezüglich dem löschen einzelner Dateien, folgendes Empfohlen:
    Die Empfehlungen des US-Verteidigungsministeriums finden sich in den Standards DoD 5220.22-M bzw. 5220.22-M ECE [6]. In der ersten Variante werden die Daten zunächst mit einem festen Wert, dann dessen Komplement und im Anschluss mit Zufallszahlen überschrieben.


    Seite 14
    https://www.tlfdi.de/imperia/md/content/datenschutz/orientierungshilfe/akt_loeschen.pdf

    Und mein Code sieht denn dementsprechend so aus:

    VB.NET-Quellcode

    1. ​Friend Shared Function SafeErase(ByVal file_path As String)
    2. For index_ As Integer = 0 To 2
    3. Dim FStream As New FileStream(file_path, FileMode.Open)
    4. Dim size As Long = FStream.Length
    5. Dim ByteArray(size - 1) As Byte
    6. Dim rnd As New Random
    7. Select Case index_
    8. Case 0
    9. For index As Integer = 0 To size - 1
    10. ByteArray(index) = 0
    11. Next
    12. Case 1
    13. For index As Integer = 0 To size - 1
    14. ByteArray(index) = 1
    15. Next
    16. Case 2
    17. Dim bytA As Byte = 0
    18. Dim bytB As Byte = 1
    19. For index As Integer = 0 To size - 1
    20. Select Case rnd.Next(0, 2)
    21. Case 0
    22. ByteArray(index) = bytA
    23. Case 1
    24. ByteArray(index) = bytB
    25. End Select
    26. Next
    27. End Select
    28. FStream.Write(ByteArray, 0, size)
    29. FStream.Flush()
    30. FStream.Close()
    31. Next
    32. File.Delete(file_path)
    33. End Function

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mr. Johny“ ()

    Nette Übung, aber wie gesagt, nur bedingt nützlich.
    Weil du lediglich den letzten Standort der Datei zerstörst und deren vorherige Lebensgeschichte vernachlässigst.

    Aber wenn es dir das Gefühl von Sicherheit gibt, soll's mir recht sein.

    Falls du paranoid bist oder wirklich wichtige Daten auf der Platte hast, hilft nur ein Tool wie SDelete mit der -x-Option, das permanent ausgeführt wird.
    Wenn du dir die Beschreibung dazu genau durchliest, wirst du auch verstehen, warum.

    Theoretisch könnte auch das Windows-Onboard-Kommandozeilenprogram CIPHER ausreichen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Selbst wenn keine Fragmente durch deine Methode sonst wo auf der Platte mehr weahren, bedenke aber auch, das durch Mechanische abnutzung der Platte, das Ding das schreibt/liest nicht mehr 100% in der Spur ist, so das solche Forensiker nach Jahren noch Fragmente von Dateien finden koennen, Teilweise sogar auch ganze Dateien wieder herstellen koennen. Sicherer waehre wie Petoad schon erwaehnte, VeraCrypt zu nutzen. So wird ja ein verschluesselter "Container" erstellt, so koennen hoechstwarscheinlich keine unverschluesselten Fragmente von den dateien auf der Platte gefunden werden.
    And i think to myself... what a wonderfuL World!
    Du versteht warscheinlich nicht was ich meine, wir sind uns alle darin einig das das NTFS Dateisystem Daten willkürlich in Blöcke auf die Festplatte speichert. Die Frage die sich nun stellt ist allerdings: Wenn die Datei bereits existiert, diese Datei aber abgeändert wird. Werden die Blöcke denn wieder willkürlich auf der Festplatte geschrieben? Oder bleiben die Blöcke gleich wenn die Datei zwar abgeändert wird aber von der Bytegröße sich kein stück ändert, denn wenn sich die Größe der Datei überhaupt nicht ändert macht es ja keinen Sinn die Datei wieder erneut willkürlich auf der Festplatte zu verteilen sondern die alten Blöcke wieder zu nutzen. Das ist also die wesentliche frage, ob beim überschreiben der Datei, wenn sich von der größe NICHTS ändert, ob die Daten denn neu auf der Festplatte verteilt werden oder nicht.

    Mr. Johny schrieb:

    ob die Daten denn neu auf der Festplatte verteilt werden oder nicht.


    Um das herauszu finden, kannst du so genannte "Festplatten-Editoren" nutzen. Nimm eine kleine HDD und probiers mal aus. Das Tool hier scheint einiges zu koennen, siehe Punkt 12.
    disk-editor.org/

    Gibt aber auch weitere Alternativen dazu.
    chip.de/downloads/Disk-Investigator_32779386.html
    And i think to myself... what a wonderfuL World!

    Mr. Johny schrieb:

    Wenn die Datei bereits existiert, diese Datei aber abgeändert wird
    speichern die meisten Programme (z.B. Office) zunächst die neue Version als neue Datei auf der Platte und löschen dann die Vorversion.
    Löschen im Sinne von Pointer zerstören.

    Nur ganz wenige Programme bearbeiten die Datei direkt an Ort und Stelle.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Wie ich es vermutet habe, sofern die Software mir wirklich die richtigen Daten gibt. Also folgendes habe ich festgestellt in der Software Disk Editor.
    Dateisystem: NTFS
    Größe: 4GB

    Dort habe ich zwei Dateien erstellt, einem Testfile.txt und direkt danach Testfile2.txt, und wie bereits gesagt das NTFS die Positionen willkürlich vergibt, so was die Offsetposition von Testfile.txt von 1073779712 bis 1073780064. Testfile2.txt war allerdings nicht direkt danach sondern an einer anderen Position unzwar 1073780736 bis 1073781088. Nun habe ich die funktion des Überschreibens bei Testfile.txt durchgeführt und die Datei auf den Byte genau belassen beim überschreiben, und trotzdem waren die Daten noch exakt auf der selben Position und haben sich nicht nochmal neu verteilt. Allerdings wurde auch nicht die Position verändert wenn die Datei größer wurde.

    Bild 1 ist die Testfile.txt datei vor dem überschreiben und Bild 2 ist es nach dem Überschreiben.

    Bei der Datei Testfile2.txt stand drin :
    Die ist ein Text mit vielen Wörtern. Willkommen in meiner Welt!

    Darauffolgend habe ich den Satz ,,Willkommen in meiner Welt!" gelöscht und abgespeichert, trotzdem war der Satz auf dem USB Stick zu finden.


    Fazit: Dateien blieben auf ihrer Position, selbst wenn sie vergrößert werden. Auch wenn Dateien auf den Byte genau überschrieben werden blieb die Datei an ihrer Position. Wenn jedoch Bytes von dieser Datei entfern wurden(Wie bei dme Beispiel Testfile2.txt) bleiben die alten Bytes bestehen, also werden nicht wirklich gelöscht.
    Bilder
    • 1.png

      93 kB, 1.025×650, 84 mal angesehen
    • 2.png

      91,64 kB, 1.025×650, 85 mal angesehen
    • 36byte.png

      97,7 kB, 1.025×650, 78 mal angesehen
    • 63byte.png

      97,66 kB, 1.025×650, 69 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mr. Johny“ ()