PyShredder – inny sposób na kasowanie plików

Ostatnio zastanawiałem się nad tym, czy jest jakaś inna możliwość kasowania plików, w sposób trudny do odzyskania. Metoda znana – zamazywanie sektorów. Ja natomiast pomyślałem o czymś innym – zamazanie zawartości pliku. Konkretniej mówiąc kilkukrotne nadpisanie jego zawartości po czym skasowanie.

Ot pomysł trywialny. Skoro myśl prosta, to i pewnie metoda odzyskania pliku po takiej zabawie również. Nie byłem pewien jak to wygląda, także spytałem się po prostu na pewnym forum. Z uzyskanej odpowiedzi od “Hash Frau” wynika, że ta metoda wbrew pozorom jest całkiem skuteczna (wcale nie, ssie :D ). Pomimo tzw. księgowania plików, odzyskanie pliku po nadpisaniu jest dość trudne, wręcz niemożliwe.

Ps, sprostowanie. Metoda jest słaba. W takim razie zdejmuję to z techbloga, natomiast napisany niżej skrypt pozostawiam do Waszej oceny :)

Ja natomiast nudząc się, a chcąc przypomnieć jako takie podstawy Pythona postanowiłem napisać naprawdę banalny programik, którego zadaniem jest wielokrotne nadpisanie pliku, a później jego skasowanie. Przyznam, że chwilkę mi zajęło zrobienie tego, ale efekt uważam za zadowalający. Proszę tego nie traktować jako jakiegoś super projektu, jeno efekt nauki. Wszelkie rady oczywiście mile widziane.

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import os
import getopt

random_dev = '/dev/urandom'

def main(argv):
	try:
		opts, args = getopt.getopt(argv, "n:", ["repeat="])
	except getopt.GetoptError: 
		usage()
		sys.exit(2)
	
	n = 10
	
	for opt, arg in opts:
		if opt in ('-n', '--repeat'):
			n = arg
	
	try:
		file_path = os.path.realpath(args[0])
	except:
		usage()
		sys.exit(2)
	
	if os.path.isdir(file_path):
		print "Only files can be overwritten!"
		sys.exit(0)
		
	try:
		file_size = os.path.getsize(file_path)
		
		try:
			overwrite = open(file_path, 'w')
			random = open(random_dev, 'rb')
			
			for i in range(0, int(n)):
				overwrite.write(random.read(file_size))
				overwrite.seek(0)
			
			print "File was overwrited %d times" % (int(n))
		except IOError:
			print "Can't open file!"
		finally:
			overwrite.close()
			random.close()
			
			os.unlink(file_path)
			print "File was deleted"
	except OSError:
		print "File %s does not exist!" % (file_path)
		
def usage():
	print "usage: %s -n|--repeat file" % (sys.argv[0])
	print "Options:"
	print "\t--repeat\tnumber of overwrites"
	print "\t-n"
	
if __name__ == "__main__":
	 main(sys.argv[1:])

W pliku licencji nie ma, toteż dopisuję, że licencja programu to WTFPL

Dla zainteresowanych link do pliku -> [o tutaj].

8 Responses to “PyShredder – inny sposób na kasowanie plików”

  1. Paweł Ciupak March 1, 2009 at 9:38 pm #

    E, po co wyciągać do tego Pythona? To da się zrobić prosto w bash-u:

    http://pawel-ciupak.ovh.org/site/raw.php?co=overwrite.sh

  2. radmen March 1, 2009 at 9:38 pm #

    No i masz, napisałem, że skorzystałęm z Pythona żęby przypomnieć sobie co i jak :) Równmie dobrze zrobisz to w ASMie. Zdaję sobie sprawę z faktu, że bash wystarczy

  3. Michał Górny March 1, 2009 at 9:38 pm #

    > if os.path.isdir(file_path)

    Pierwszy fail, niby „only files”, a tu różne cudaki przypasują < ;.

    > file_size = os.path.getsize(file_path)

    Drugi fail, nigdy nie wolno polegać na wynikach statowania.

    > overwrite.write(random.read(file_size))

    Trzeci fail. Raz, że kosmicznie nieoptymalne (najpierw program „wisi” i torturuje procesor, a potem dopiero zaczyna męczyć dysk). Dwa, że przy większym pliku będzie piękny efekt oom.

    > print „File was overwrited %d times” % (int(n))

    U fail at english, Sir.

    Nie powinieneś również tak postępować z wyjątkiem OSError. „Plik nie istnieje” to nie jedyny błąd na świecie. Jeśli nie interesują cię pozostałe błędy, sprawdzaj chociaż czy to ten, i ewentualnie reraisuj (jak to powiedzieć po polsku?) wyjątek.

  4. radmen March 1, 2009 at 9:38 pm #

    MGórny: co do pierwszego faila to się nie zgodzę. Ludzie różne rzeczy podają, program ma nadpisywać pliki, a nie katalogi. Fail dwa: czekam na propozycje zmiany tego na coś innego. Fail 3 – zdaję sobie z tego sprawę. Dane możnaby pobierać mniejszymi partiami i takimi apisywać do pliku. Fail ostatni – cóż od dawna nie piszę po angielsku, takie są tego efekty.

  5. Michał Górny March 1, 2009 at 9:38 pm #

    #1: To teraz sobie wyobraź, że ludzie podadzą FIFOlka.
    #2: Czytasz aż zwróci EOF.

  6. radmen March 1, 2009 at 9:38 pm #

    MGorny: #1 – point taken. #2 ok, można tak. Wytłumacz mi teraz proszę dlaczego nie używać stata. Jak na mój rozum edyne przekłamania jakie może zwracać to przez winę filesystemu, ale mogę się mylić.

  7. Michał Górny March 1, 2009 at 9:38 pm #

    radmen: Dochodzi jeszcze modyfikacja pliku w trakcie, ale tego raczej nie musisz brać pod uwagę. Za to winę filesystemu — jak najbardziej. Są w końcu i takie, które w ogóle rozmiaru nie podają (bo np. określenie go jest zbyt kosztowne).

  8. radmen March 1, 2009 at 9:38 pm #

    Rozumiem. Dzięki, postaram się zapamiętać, a w wolnej chwili zmienię to.