Disk-Eraser...

Du hast eine Idee für ein Projekt?
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Um eine Festplatte oder den freien Speicherplatz unwiederbringlich zu löschen, muß man diesen ja nur überschreiben...

Es gibt zwar die Freeware "Eraser": http://www.heidi.ie/eraser/

Aber sowas kann man ja schnell auch selber machen.

Hier mal ein schnellschuß, ein erster Test:

Code: Alles auswählen

import os, random

def write1024RandomBytes( FileHandle ):
    # Schreibt 1 KB Zufällige Zeichen
    for i in xrange( 1024 ):
        FileHandle.write( chr( random.randint(0,255) ) )


def write1024NullBytes( FileHandle ):
    FileHandle.write("\x00" * 1024)



FileHandle = file( "Test.dat" , "w" )


for i in xrange( 1024 ):
    #~ write1024NullBytes( FileHandle )
    write1024RandomBytes( FileHandle )
    print i+1,"KB geschrieben"
Geschrieben werden dabei erstmal nur 1MB Test-"Daten"...
Was auffällt, ist das die Random Geschichte super lange gegenüber dem einfachen Schreiben von NULL-Bytes...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich wäre mir da gar nicht so sicher, ob das OS exakt den gleiche Speicherplatz überschreibt, oder nur den alten auf frei setzt und dann dein 1 kB nicht irgendwo anders, wo es grade mehr passt reinschreibt.

Wenn du ein schnelleres und auch besseres random brauchst nimm doch crng, das recht schnell ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Leonidas hat geschrieben:Ich wäre mir da gar nicht so sicher, ob das OS exakt den gleiche Speicherplatz überschreibt...
Natürlich hast du da recht... Es war auch erstmal nur ein genereller Test... Es soll eigentlich die Platte bis auf's letzte Byte voll geschriebene werden. ;)
(Dafür brauche ich die Information, wieviel Bytes noch frei sind: http://python.sandtner.org/viewtopic.php?p=15824 )

Von crng gibt es leider keine Windows-Binaries :(
BlackJack

Wenn Du Python 2.4 einsetzt, dann würde ich die Zufallsdaten aus 'os.urandom()' nehmen. Ist vielleicht schneller und zufälliger als der Generator in 'random'.

Einzelne Dateien wirst Du nicht sicher löschen können, das kann man bei modernen Dateisystemen vergessen. Wie Leonidas schon schrieb, ist nicht garantiert, dass die Daten genau an der Stelle der alten Datei landen. Bei "Journaling"-Dateisystemen, also z.B. NTFS, ReiserFS, ext3 usw. ist das sogar garantiert nicht der Fall.

Mit dem Abfragen des Plattenplatzes braucht man sich wohl nicht aufzuhalten. Der ändert sich doch ständig. Irgendeine Anwendung, oder das Betriebssystem selbst, schreibt immer in irgendeine Logdatei. Ausserdem gibt's ab und zu auch Quota, die einem Benutzer nicht erlauben beliebig viel Plattenplatz zu belegen, auch wenn noch welcher frei ist. Unter Linux ist es zum Beispiel üblich, dass immer ca. 5% Plattenplatz für den Benutzer 'root' frei gehalten werden, damit der Admin im Notfall noch ein wenig Luft zum arbeiten hat.

Schreib' doch einfach solange, bis eine Ausnahme ausgelöst wird.
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Unter Linux empfehle ich
a) shred
b) mit der guten shell ein
cat /dev/urandom > /dev/hdX

cu beyond
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

BlackJack hat geschrieben:Wenn Du Python 2.4 einsetzt, dann würde ich die Zufallsdaten aus 'os.urandom()' nehmen. Ist vielleicht schneller und zufälliger als der Generator in 'random'.
Jep! os.urandom() ist um einiges schneller... Zumal es ja schon Zufällige Zeichen beliebiger länge liefert: http://python.org/doc/lib/os-miscfunc.html
Somit kann ich direkt einen Block von z.B. 1KB schreiben lassen.

Neue Test-Version:

Code: Alles auswählen

import os, time

def write1024RandomBytes( FileHandle, Bytes ):
    FileHandle.write( os.urandom(Bytes) )

def write1024NullBytes( FileHandle, Bytes ):
    FileHandle.write("\x00" * Bytes)

FileHandle = file( "Test.dat" , "w" )

BlockSize = 1024 * 1024 * 10

StartZeit = time.time()

BytesWrited = 0

for i in xrange( 10 ):
    BytesWrited += BlockSize
    print "schreibe", BytesWrited/1024/1024, "MBytes...",

    write1024NullBytes( FileHandle, BlockSize )
    #~ write1024RandomBytes( FileHandle, BlockSize )

    AktuelleZeit = time.time()
    print "OK (%.3f sek.)" % (AktuelleZeit - StartZeit)
Wenn ich 100MB leeren String scheibe, dauert das ca. 7.8Sek Das gleiche mit os.urandom() dauert ca. 9.6Sek... Also nicht sonderlich mehr... Wobei wenn man es auf 160GB hochrechnet ;)
Einzelne Dateien wirst Du nicht sicher löschen können
Wie geschrieben, das soll auch garnicht das Ziel sein... Ehr halt ganze Festplatten... Wenn man z.B. eine verkauft, sollten die ehemals vorhandenen Daten auch wirklich gelöscht sein ;)
Schreib' doch einfach solange, bis eine Ausnahme ausgelöst wird.
Das wäre auch meine Lösunge gewesen, nur so kann man leider keinen prozentualen Fortschritt und auch keine Zeit schätzen lassen :(
Wenn man wirklich 40, 60, 80, 160GB löschen will, dauert das schon einige Zeit lang ;)
cat /dev/urandom > /dev/hdX
OK, dann hat sich das für Linux schon mal erledigtm danke für den Tipp ;)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

jens hat geschrieben:Von crng gibt es leider keine Windows-Binaries :(
Doch.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hey, da gibt es ja mittlerweile so einige Binaries! Super!

Allerdings denke ich nicht das crng so viel schneller als die os.urandom() Lösung sein wird, was eine extra installation rechfertigen würde...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

jens hat geschrieben:Hey, da gibt es ja mittlerweile so einige Binaries! Super!
Ja, mir war etwas langweilig.
jens hat geschrieben:Allerdings denke ich nicht das crng so viel schneller als die os.urandom() Lösung sein wird, was eine extra installation rechfertigen würde...
Nein, aber viellicht "zufälliger", wenn es um extreme Sicherheit geht ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Leonidas hat geschrieben:Nein, aber viellicht "zufälliger", wenn es um extreme Sicherheit geht ;)
Naja, ich denke sowieso, das ein überschreiben mit NULL-Bytes schon reicht... Das mit den Zufälligen Zeichensalat ist nur noch mal ein NiceToHave Ding...
BlackJack

Die Zeit für die 0x00-Strings kannst Du vielleicht noch etwas drücken wenn Du sie nicht bei jedem Aufruf erzeugst, sondern nur einmal. Das ``'\x00' * bytes`` wird bei jedem Aufruf ausgeführt. Ist nur die Frage wer langsamer bzw. schneller ist -- der Prozessor oder die Platte.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Der Unterschied ist zwar nur maginal, aber ein Tick schneller wird es glaub ich schon... Danke!

Ich habe noch eingebaut, das eine evtl. eingeschaltete NTFS-Komprimierung mit dem Befehl compact aufgehoben wird... Denn gerade ein Haufen NULL-Bytes wird ohne ende komprimiert, sodas das Laufwerk nie voll wird ;)

Die aktuelle Version ist auf meiner Homepage zu finden:
PyDiskEraser
Zuletzt geändert von jens am Dienstag 5. Juli 2005, 06:38, insgesamt 1-mal geändert.
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Der Thread ist zwar schon ein paar Tage alt, ich möchte meinen Senf aber noch dazugeben.

Bei den älteren Filsystemen wie DOS, VFAT, EXT2, etc. mag diese Methode funktionieren. Bei Journaling Filesystemen, z. B. Raiser FS, funktioniert es definitiv nicht. Ob einzelne Dateien zuverlässig in Journaling Filesystemen überschrieben werden können, kann ich allerdings nicht sagen.

Ich setze für soetwas dBan ein. Löscht Partitionen und ganze Festplatten zuverlässig. dBAN

Hans
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

hans hat geschrieben:Ich setze für soetwas dBan ein. Löscht Partitionen und ganze Festplatten zuverlässig. dBAN
Hmm, ich denke ein dd gekoppelt an /dev/null oder /dev/urandom, das das ganze System überschreibt sollte ausreichend sicher sein :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten