Seite 1 von 1

Disk-Eraser...

Verfasst: Montag 21. Februar 2005, 20:11
von jens
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...

Verfasst: Montag 21. Februar 2005, 20:33
von Leonidas
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.

Verfasst: Montag 21. Februar 2005, 22:00
von jens
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 :(

Verfasst: Montag 21. Februar 2005, 23:54
von 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.

Verfasst: Dienstag 22. Februar 2005, 00:41
von Beyond
Unter Linux empfehle ich
a) shred
b) mit der guten shell ein
cat /dev/urandom > /dev/hdX

cu beyond

Verfasst: Dienstag 22. Februar 2005, 07:01
von jens
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 ;)

Verfasst: Dienstag 22. Februar 2005, 14:51
von Leonidas
jens hat geschrieben:Von crng gibt es leider keine Windows-Binaries :(
Doch.

Verfasst: Dienstag 22. Februar 2005, 16:11
von jens
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...

Verfasst: Dienstag 22. Februar 2005, 16:13
von Leonidas
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 ;)

Verfasst: Dienstag 22. Februar 2005, 16:16
von jens
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...

Verfasst: Mittwoch 23. Februar 2005, 01:48
von 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.

Verfasst: Mittwoch 23. Februar 2005, 07:11
von jens
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

Verfasst: Sonntag 6. März 2005, 23:10
von hans
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

Verfasst: Montag 7. März 2005, 17:28
von Leonidas
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 :)