Bezpieczne usuwanie danych

0

Od kilku dni jestem w stanie lekkiego WTF. Piszę mały program do bezpowrotnego usuwania plików. Jak każdy wie najlepszym rozwiązaniem jest nadpisanie, co też robię. Wszystko piszę w WinAPI (CreateFile, WriteFile, DeleteFile), chociaż to akurat nie stanowi problemu. Dlaczego? Program fajnie usuwa pliki, ale po otwarciu ich w Ontrack Professional wszystko widać jak na dłoni. Jak to możliwe?

Sprawdzałem na prostych plikach tekstowych, więc nie ma kopii. Pliki są nadpisywane na 100%, bo testowałem program z pominięciem ostatniego kroku (usuwania) i w hexedytorze pięknie widać same x00 :-) Gdy je następnie usunę za pomocą Shift+Delete, to w Ontrack'u plik też jest czysty. Tymczasem gdy usuwam go bezpośrednio z programu, to za każdym razem da się odtworzyć oryginalną zawartość.

W trakcie poszukiwania przyczyny znalazłem też taki program (ze źródłami): http://www.devarticles.com/c/a/Delphi-Kylix/Secure-File-Deletion-in-Delphi/ i efekt jest podobny jak w przypadku mojego softu :)

Jakieś koncepcje?

0

Ale ty tylko ustawiasz bity tego pliku na same 0? W takim razie się nie dziw. Jedyny sensowny sposób to zamazywanie danych losowymi wartościami, najlepiej kilkukrotnie.
tutaj:
http://pl.wikipedia.org/wiki/Algorytm_Gutmanna
masz mniej wiecej troche na temat tego "dlaczego zerowanie nie zadziała"
http://pl.wikipedia.org/wiki/Algorytm_Schneinera

0

Program pisze na podstawie artykułu Overwriting Hard Drive Data: The Great Wiping Controversy, w którym autorzy wyjaśniają że wystarczy nadpisać plik raz, obojętnie czym. I tak też robię. Algorytm Guttmanna miał zastosowanie w przypadku dyskietek, zresztą możesz poczytać o tym na stronie http://www.heise-online.pl/security/features/Bezpieczne-usuwanie-danych-cztery-razy-po-dwa-razy-to-za-wiele-778088.html.

Problem tkwi gdzie indziej.

0

daj tak dla jasności krok po kroku co robisz z tym plikiem

0
  N := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if N <> INVALID_HANDLE_VALUE then
  begin
    GetFileSizeEx(N, NSize);
    SetFilePointer(N, 0, nil, FILE_BEGIN);
    ZeroMemory(@FileBuffer, SizeOf(FileBuffer));
    Counter := NSize.Lo div 4096;
    if Counter = 0 then Inc(Counter);
    for i:=0 to Counter do
      WriteFile(N, FileBuffer, 4096, NBytes, nil);
  end;
  CloseHandle(N);                     // zapomnialem tego wkleic do posta :)
  DeleteFile(PChar(FileName))

Inkrementację dodałem ze względu na pliki mniejsze niż bufor (< 4096 bajtów). Próbowałem też wersji z Counter - 1 (w pętli), ale bez rezultatu.

0

Nie testowalem (chyba powinno robic to Closehandle) ale moze zawolac FlushFileBuffers

0

reichel, tak!

Ze wstępnych testów dodanie FlushFileBuffers przed CloseHandle pomogło. Dzięki Mistrzu!

0

Shalom:
znasz jakiś przypadek, żeby ktoś odzyskał zawartość jakiegoś pliku z dysku twardego (nie starszego niż pięć lat) po jednokrotnym nadpisaniu?

1 użytkowników online, w tym zalogowanych: 0, gości: 1