Ich möchte ein Skript erstellen, mit dem ich die Partition F sicher löschen kann z.B. mit drei Durchläufen. Ich weiss, dass es viele Programme gibt, die diese Funktion können, aber mich interessiert der Weg mit Python.
Hat jemand einen Vorschlag?
Löschbefehl mit Python?
- DeaD_EyE
- User
- Beiträge: 1017
- Registriert: Sonntag 19. September 2010, 13:45
- Wohnort: Hagen
- Kontaktdaten:
Was für ein Betriebssystem wird verwendet?
Unter Linux ist alles eine Datei. Das macht den Vorgang recht einfach.
Du kannst das Blockdevice /dev/sdx als Datei im Schreibmodus öffnen,
musst aber als root angemeldet sein, da sonst die Berechtigung fehlt.
Ich bis jetzt selbst noch nicht auf Blockdevices geschrieben.
Erst hole ich mir die Größe des Blockdevices bzw. der Datei.
Dann eine for-schleife in der ich einfach mehrmals überschreiben kann.
Im while Block schreibe ich dann so lange, bis der rest == 0 ist.
Anstatt einfach \x00 zu schreiben, generiere ich Zufallszahlen.
Den Code konnte ich leider nur mit einer Datei testen.
Bei der Angabe des Devices sollte darauf geachtet werden, dass es das richtige ist.
Leider garantiert das Überschreiben nicht, dass Daten wirklich gelöscht worden sind.
Bei SSD wird es etwas komplexer. Dort können sich z.B. Daten auf den Flash-Chips verstecken, an die der normale User niemals wieder rankommt, auch nicht zum Löschen.
Unter Linux ist alles eine Datei. Das macht den Vorgang recht einfach.
Du kannst das Blockdevice /dev/sdx als Datei im Schreibmodus öffnen,
musst aber als root angemeldet sein, da sonst die Berechtigung fehlt.
Ich bis jetzt selbst noch nicht auf Blockdevices geschrieben.
Erst hole ich mir die Größe des Blockdevices bzw. der Datei.
Dann eine for-schleife in der ich einfach mehrmals überschreiben kann.
Im while Block schreibe ich dann so lange, bis der rest == 0 ist.
Anstatt einfach \x00 zu schreiben, generiere ich Zufallszahlen.
Den Code konnte ich leider nur mit einer Datei testen.
Bei der Angabe des Devices sollte darauf geachtet werden, dass es das richtige ist.
Code: Alles auswählen
def erase(device, turns):
if pathlib.Path(device).is_block_device():
st = os.statvfs(device)
size = st.f_blocks * st.f_bsize
else:
size = os.path.getsize(device)
blocksize = 4096
for i in range(turns):
rest = size
with open(device, 'wb') as fd:
while rest != 0:
chunksize = min(rest, blocksize)
chunk = os.urandom(chunksize)
fd.write(chunk)
rest -= len(chunk)
Bei SSD wird es etwas komplexer. Dort können sich z.B. Daten auf den Flash-Chips verstecken, an die der normale User niemals wieder rankommt, auch nicht zum Löschen.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
- noisefloor
- User
- Beiträge: 3854
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
So wie von DeaD_Eye gezeigt lässt sich das im Prinzip auch sehr ähnlich in anderen Sprachen implementieren.
Gruß, noisefloor
Da gibt es nicht viel "pythonisches". Die Sprache ist hier ja nur Mittel zum Zweck, um das Laufwerk mit Nullen, Zufallszahlen oder was auch immer zu überschreiben.Ich weiss, dass es viele Programme gibt, die diese Funktion können, aber mich interessiert der Weg mit Python.
So wie von DeaD_Eye gezeigt lässt sich das im Prinzip auch sehr ähnlich in anderen Sprachen implementieren.
Gruß, noisefloor
Angeblich gibt es restmagnetisierungen, die bei nur-nullen-schreiben von der NSA wieder sichtbar gemacht werden koennen. Wie sehr das nun unter aluhutiges faellt oder nicht vermag ich nicht zu sagen. Prinzipiell vorstellbar ist es, aber warum nun *mehr* als einmal ueberschreiben mit Zufallszahlen wichtig sein sollte erschliesst sich mir auch nicht.
- noisefloor
- User
- Beiträge: 3854
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
@darktrym: früher™ war es mal so, dass bei klassischen, magnetischen Festplatten das 1-fache Überschreiben nicht reichte, um die Daten verlässlich zu löschen. Mit den entsprechenden (Hardware-) Tools und Aufwand ließen sich Daten rekonstruieren. Das hatte AFAIK was mit der Ausrichtung der Magnetpartikel (die die Daten speichern) zu tun, also dass man deren ursprüngliche Ausrichtung bei 1-fachem Überschreiben rekonstruieren konnte.
Zufallszahlen haben AFAIK den Vorteil, dass man einen nicht-definierten Endzustand hat. Überschreibt man "nur" mit Nullen oder Einsen, dann ist der Endzustand definiert und der Ausgangszustand leichter rekonstruierbar.
Ein paar weitere Infos gibt's hier: https://wiki.ubuntuusers.de/Daten_sicher_löschen.
Gruß, noisefloor
@darktrym: früher™ war es mal so, dass bei klassischen, magnetischen Festplatten das 1-fache Überschreiben nicht reichte, um die Daten verlässlich zu löschen. Mit den entsprechenden (Hardware-) Tools und Aufwand ließen sich Daten rekonstruieren. Das hatte AFAIK was mit der Ausrichtung der Magnetpartikel (die die Daten speichern) zu tun, also dass man deren ursprüngliche Ausrichtung bei 1-fachem Überschreiben rekonstruieren konnte.
Zufallszahlen haben AFAIK den Vorteil, dass man einen nicht-definierten Endzustand hat. Überschreibt man "nur" mit Nullen oder Einsen, dann ist der Endzustand definiert und der Ausgangszustand leichter rekonstruierbar.
Ein paar weitere Infos gibt's hier: https://wiki.ubuntuusers.de/Daten_sicher_löschen.
Gruß, noisefloor
Am sinnvollsten ist es einfach alles zu verschlüsseln, dann reicht es das Passwort zu vernichten. Das funktioniert auch bei SSDs.
Wer wirklich paranoid ist sollte physikalisch die Hardware zerstören. Wobei bei der NSA o.ä. Organisationen natürlich https://xkcd.com/538/ gilt.
Auf StackOverflow gibt es übrigens einen Beitrag der ziemlich gut erklärt wo dass mit dem mehrfach überschreiben herkommt.
Wer wirklich paranoid ist sollte physikalisch die Hardware zerstören. Wobei bei der NSA o.ä. Organisationen natürlich https://xkcd.com/538/ gilt.
Auf StackOverflow gibt es übrigens einen Beitrag der ziemlich gut erklärt wo dass mit dem mehrfach überschreiben herkommt.
- noisefloor
- User
- Beiträge: 3854
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
@darktrym; was beim Löschen "sinnvoll" ist hängt auch stark davon ab, wie paranoid man ist. Oder: Glaube versetzt Berge. Oder: Placebo-Effekt.
Ansonsten ist es im vom DasIch verlinkten Artikel ja ganz gut erklärt.
Gruß, noisefloor
@darktrym; was beim Löschen "sinnvoll" ist hängt auch stark davon ab, wie paranoid man ist. Oder: Glaube versetzt Berge. Oder: Placebo-Effekt.
Ansonsten ist es im vom DasIch verlinkten Artikel ja ganz gut erklärt.
Gruß, noisefloor
-
- User
- Beiträge: 8
- Registriert: Sonntag 8. April 2018, 09:28
Danke für die ausführliche Antwort. Nehmen wir an ich möchte die Datei C:\Daten\Beispieldatei sicher löschen. Wo muss ich deinen Code ergänzen? Ich nutze Windows7 64 BIT
Danke
Tanja
Danke
Tanja
DeaD_EyE hat geschrieben:Was für ein Betriebssystem wird verwendet?
Unter Linux ist alles eine Datei. Das macht den Vorgang recht einfach.
Du kannst das Blockdevice /dev/sdx als Datei im Schreibmodus öffnen,
musst aber als root angemeldet sein, da sonst die Berechtigung fehlt.
Ich bis jetzt selbst noch nicht auf Blockdevices geschrieben.
Erst hole ich mir die Größe des Blockdevices bzw. der Datei.
Dann eine for-schleife in der ich einfach mehrmals überschreiben kann.
Im while Block schreibe ich dann so lange, bis der rest == 0 ist.
Anstatt einfach \x00 zu schreiben, generiere ich Zufallszahlen.
Den Code konnte ich leider nur mit einer Datei testen.
Bei der Angabe des Devices sollte darauf geachtet werden, dass es das richtige ist.
Leider garantiert das Überschreiben nicht, dass Daten wirklich gelöscht worden sind.Code: Alles auswählen
def erase(device, turns): if pathlib.Path(device).is_block_device(): st = os.statvfs(device) size = st.f_blocks * st.f_bsize else: size = os.path.getsize(device) blocksize = 4096 for i in range(turns): rest = size with open(device, 'wb') as fd: while rest != 0: chunksize = min(rest, blocksize) chunk = os.urandom(chunksize) fd.write(chunk) rest -= len(chunk)
Bei SSD wird es etwas komplexer. Dort können sich z.B. Daten auf den Flash-Chips verstecken, an die der normale User niemals wieder rankommt, auch nicht zum Löschen.
- DeaD_EyE
- User
- Beiträge: 1017
- Registriert: Sonntag 19. September 2010, 13:45
- Wohnort: Hagen
- Kontaktdaten:
Code: Alles auswählen
datei = r"C:\Daten\Beispieldatei"
erase(datei, 3)
Ich bin noch nicht wach. Es verhindert, dass die Escape-Sequenzen wie z.B. \n \b \t usw interpretiert werden.
Problematisch wäre z.B. dieser Pfad "C:\Programme\nuke-tools\data.sqlite", dort wird \n als neue Zeile interpretiert.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
- DeaD_EyE
- User
- Beiträge: 1017
- Registriert: Sonntag 19. September 2010, 13:45
- Wohnort: Hagen
- Kontaktdaten:
Vielleicht....
Es hängt vom Controller und vom Dateisystem ab. Verlassen würde ich mich auf so etwas nicht!
Einfaches Beispiel:
Das Programm führt den Schreibbefehl auf die Datei aus. Das Dateisystem könnte jetzt z.B. entscheiden ganz woanders hinzuschreiben. Wo, wird letztendlich in einer Tabelle festgehalten. Die Dateisystemschicht sendet dann die Befehle an den Controller, der diese z.B. auch umsortiert und auch ggf. in andere Sektoren schreibt, weil z.B. Sektoren kaputt sind.
Letztendlich ist das Programm die oberste Ebene der Abstraktion. Was in den Ebenen weiter darunter passiert, kann das Programm nicht steuern.
Dein Programm wird niemals wissen, ob die Aktion erfolgreich war oder nicht.
Am besten eignet sich ein dicker Hammer und ein Akkuschrauber mit Spiralbohrer.
Es hängt vom Controller und vom Dateisystem ab. Verlassen würde ich mich auf so etwas nicht!
Einfaches Beispiel:
Das Programm führt den Schreibbefehl auf die Datei aus. Das Dateisystem könnte jetzt z.B. entscheiden ganz woanders hinzuschreiben. Wo, wird letztendlich in einer Tabelle festgehalten. Die Dateisystemschicht sendet dann die Befehle an den Controller, der diese z.B. auch umsortiert und auch ggf. in andere Sektoren schreibt, weil z.B. Sektoren kaputt sind.
Letztendlich ist das Programm die oberste Ebene der Abstraktion. Was in den Ebenen weiter darunter passiert, kann das Programm nicht steuern.
Dein Programm wird niemals wissen, ob die Aktion erfolgreich war oder nicht.
Am besten eignet sich ein dicker Hammer und ein Akkuschrauber mit Spiralbohrer.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
TanjaLorenz hat geschrieben:Ich möchte .. die Partition F sicher löschen .. z.B. mit drei Durchläufen. Ich weiss, dass es viele Programme gibt, die diese Funktion können
Was denn nun? :KTanjaLorenz hat geschrieben:Nehmen wir an ich möchte die Datei C:\Daten\Beispieldatei sicher löschen.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
-
- User
- Beiträge: 8
- Registriert: Sonntag 8. April 2018, 09:28
C:\Daten\Beispieldatei sicher löschen. da eine recht umfangreiche Antwort nicht darauf eingegangen ist.
- DeaD_EyE
- User
- Beiträge: 1017
- Registriert: Sonntag 19. September 2010, 13:45
- Wohnort: Hagen
- Kontaktdaten:
Eine Zwiebel beschreibt das technische Problem ziemlich gut. Dein Programm sieht erstmal nur die Äußere Schicht der Zwiebel und kann Befehle an diese Zwiebel schicken. Die Äußerste Schicht der Zwiebel leitet den Befehl an die inneren Schichten weiter. Von außen ist aber nicht festzustellen, was innen passiert ist.
Hier gibt es ein paar gute Kommentare zu dem Problem: https://askubuntu.com/questions/57572/h ... ure-manner
Eine logischer Schritt wäre es z.B. die Festplatte zu verschlüsseln. Sogar Windows sollte das können.
Der Code ist nicht getestet und wie bereits ausgiebig diskutiert, ist es absolut nicht zu empfehlen wenn z.B. dein Leben davon abhängt.
Nicht ohne Grund existieren Dienstleister, die Festplatten sicher löschen und dann entsorgen. Verschlüsseln wäre der richtige Weg. Dann sind die Daten zumindest nicht interpretierbar.
Hier gibt es ein paar gute Kommentare zu dem Problem: https://askubuntu.com/questions/57572/h ... ure-manner
Eine logischer Schritt wäre es z.B. die Festplatte zu verschlüsseln. Sogar Windows sollte das können.
Code: Alles auswählen
import os
def erase(file, turns):
size = os.path.getsize(device)
blocksize = 4096
for i in range(turns):
rest = size
with open(device, 'wb') as fd:
while rest != 0:
chunksize = min(rest, blocksize)
chunk = os.urandom(chunksize)
datei = r'C:\Daten\Beispieldatei'
erase(datei, 10)
Nicht ohne Grund existieren Dienstleister, die Festplatten sicher löschen und dann entsorgen. Verschlüsseln wäre der richtige Weg. Dann sind die Daten zumindest nicht interpretierbar.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Eine mechanische Festplatte mit magnetischen Datenträgern (so wie sie seit jeher bis zur Entwicklung von Flashspeicher auch heute noch weltweit millionenfach im Einsatz sind) lässt sich durch mehrfaches Überschreiben sicher löschen. Der VSITR-Standard des BSI (Bundesamt für Sicherheit in der Informationstechnik) schrieb ein 7-maliges Überschreiben vor. Allerdings ist der Standard heute nicht mehr gültig. Heutige Standards empfehlen ein 30-maliges Überschreiben und mehr...
Auch ist es bei Magnetfestplatten möglich, einzelne Dateien zu löschen. Hierzu muss man aber ermitteln, in welchen Sektoren die fragliche Datei tatsächlich gespeichert ist. Hierzu gibt es Tools wie z. B. TSK (The Sleuth Kit), die das problemlos leisten und mit denen man FAT, NTFS und Ext-Dateisysteme bestens 'rauf und runter' analysieren kann.
Bei modernen Betriebssystemen und Anwendungen ist das Löschen allerdings weitaus problematischer. Bei Microsoft Windows wurde z. B. mit Vista der Volume Shadow Copy Service (VSC) eingeführt, der Versionen von Dateien auf der Festplatte erzeugt (ohne dass der Anwender davon etwas mitbekommt). Die Versionen werden jedoch nicht autark einfach als Kopie des Originals gespeichert, sondern in komplexen Verfahren in 64KB großen Blöcken. Nur der VSC "weiss" in welchen Blöcken eine Version verteilt bzw. gespeichert ist. Der Anwender kann nur über den VSC über die Option "Vorherige Version wieder herstellen" auf eine Version zugreifen. Er kann die Dateiversion auf der Festplatte, also die Sektoren, in denen die Dateiversion tatsächlich gespeichert ist, ohne tiefe Kenntnisse jedoch niemals auffinden und daher auch nicht sicher löschen. Wird also eine einzelne Datei durch mehrfaches Überschreiben vermeintlich sicher gelöscht, kann nicht ausgeschlossen werden, ob nicht noch irgendwo auf der Festplatte eine weitere Version davon "rumliegt". Und auch viele Anwendungen speichern Kopien von Dateien, die nicht ohne Weiteres auf der Festplatte zu finden sind (z. B. Thumbnails in Thumbnail-Datenbanken. Viele Webbrowser cachen Dateien in proprietären Datenstrukturen, E-Mail-Anhänge in Mailcontainern, Backups, virtuelle Maschinen u.v.m.).
Und völlig anders ist es bei Flashspeichern, also z. B. bei SSD-Platten oder NVMe-Karten. Hier werden hochkomplexe Verfahren angewendet, um die Schreibzyklen gleichmäßig auf die Speicherzellen zu verteilen. Hierzu verschiebt der Controler unentwegt Daten (DeaD_EyE hat dieses Verfahren (Wear-Leveling) ja bereits weiter oben angedeutet). Darüber hinaus werden defekte Speicherzellen auf 'Reservezellen' gemappt usw. Aus diesen Gründen lassen sich die Speicherzellen, in denen eine Datei tatsächlich gespeichert ist, bei SSD-Platten nicht identifizieren. Dies 'weiß', nur der Controler. Daher ist ein sicheres Löschen hier nicht wirklich möglich.
Falls Datenträger mit sensiblen Daten absolut sicher entsorgt werden müssen, sollten sie physikalisch zerstört werden (Schreddern, Hochofen etc.).
Gruß
Tom
Auch ist es bei Magnetfestplatten möglich, einzelne Dateien zu löschen. Hierzu muss man aber ermitteln, in welchen Sektoren die fragliche Datei tatsächlich gespeichert ist. Hierzu gibt es Tools wie z. B. TSK (The Sleuth Kit), die das problemlos leisten und mit denen man FAT, NTFS und Ext-Dateisysteme bestens 'rauf und runter' analysieren kann.
Bei modernen Betriebssystemen und Anwendungen ist das Löschen allerdings weitaus problematischer. Bei Microsoft Windows wurde z. B. mit Vista der Volume Shadow Copy Service (VSC) eingeführt, der Versionen von Dateien auf der Festplatte erzeugt (ohne dass der Anwender davon etwas mitbekommt). Die Versionen werden jedoch nicht autark einfach als Kopie des Originals gespeichert, sondern in komplexen Verfahren in 64KB großen Blöcken. Nur der VSC "weiss" in welchen Blöcken eine Version verteilt bzw. gespeichert ist. Der Anwender kann nur über den VSC über die Option "Vorherige Version wieder herstellen" auf eine Version zugreifen. Er kann die Dateiversion auf der Festplatte, also die Sektoren, in denen die Dateiversion tatsächlich gespeichert ist, ohne tiefe Kenntnisse jedoch niemals auffinden und daher auch nicht sicher löschen. Wird also eine einzelne Datei durch mehrfaches Überschreiben vermeintlich sicher gelöscht, kann nicht ausgeschlossen werden, ob nicht noch irgendwo auf der Festplatte eine weitere Version davon "rumliegt". Und auch viele Anwendungen speichern Kopien von Dateien, die nicht ohne Weiteres auf der Festplatte zu finden sind (z. B. Thumbnails in Thumbnail-Datenbanken. Viele Webbrowser cachen Dateien in proprietären Datenstrukturen, E-Mail-Anhänge in Mailcontainern, Backups, virtuelle Maschinen u.v.m.).
Und völlig anders ist es bei Flashspeichern, also z. B. bei SSD-Platten oder NVMe-Karten. Hier werden hochkomplexe Verfahren angewendet, um die Schreibzyklen gleichmäßig auf die Speicherzellen zu verteilen. Hierzu verschiebt der Controler unentwegt Daten (DeaD_EyE hat dieses Verfahren (Wear-Leveling) ja bereits weiter oben angedeutet). Darüber hinaus werden defekte Speicherzellen auf 'Reservezellen' gemappt usw. Aus diesen Gründen lassen sich die Speicherzellen, in denen eine Datei tatsächlich gespeichert ist, bei SSD-Platten nicht identifizieren. Dies 'weiß', nur der Controler. Daher ist ein sicheres Löschen hier nicht wirklich möglich.
Falls Datenträger mit sensiblen Daten absolut sicher entsorgt werden müssen, sollten sie physikalisch zerstört werden (Schreddern, Hochofen etc.).
Gruß
Tom