Thema: Delphi 35 Mal überschreiben

Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

Re: 35 Mal überschreiben

  Alt 29. Jul 2004, 17:00
Zitat von HW764:
Ich habe diesen Code, der eine Datei 6 mal überschreibt.
Der Code ist Kot.
Denn BlockWrite ist eine gepufferte Funktion; es ist nicht sicher, dass die Daten jemals alle auf die Platte kommen.
35-faches Überschreiben ist übertrieben; am Besten man füllt die Datei zum Schluss mit
zufälligen Schrottdaten, dann versagt jedes Partial Response Verfahren.

Hier ist mein Gegenvorschlag:
Delphi-Quellcode:
procedure ShredderFile(const filename:string);
const
  Fillchars: array[0..5] of char = (Char($00), Char($FF), Char($00), Char($F0), Char($0F), Char($00));
  BLOCK_SIZE = 8096;
var
   fs : TFileStream;
   buffer : String;
   i, j : Integer;
begin
   fs := TFileStream.Create(filename, fmOpenReadWrite or fmShareExclusive);
   try
      // Datei auf nächste Blockgrösse verlängern, damit der "Slack" überschrieben
      // wird
      fs.Size := ((fs.Size div BLOCK_SIZE) +2) * BLOCK_SIZE;

      // Datei soll mindestens 2 MB gross sein, damit die Schreibcaches der
      // Festplatten überflutet werden
      if fs.Size < 2097152 then
         fs.Size := 2097152;


      for i := 0 to 5 do
      begin
         fs.Position := 0;
         buffer := StringofChar(Fillchars[i], BLOCK_SIZE);

         for j := 1 to fs.Size div BLOCK_SIZE do
         begin
            fs.WriteBuffer(buffer[1], BLOCK_SIZE);
         end;
         FlushFileBuffers(fs.Handle);
      end;

      // wir verarschen den Geheimdienst und schreiben zum Schluss
      // seltsame Schrottdaten
      // wirkliche Zufallsdaten wären besser, aber das reicht doch auch schon
      buffer := 'Terror, Bin Laden, Sprengstoff, Waffen, Plutonium';
      fs.Position := 0;
      for j := 1 to fs.Size div Length(buffer) do
      begin
         fs.WriteBuffer(buffer[1], Length(buffer));
      end;
   finally
      fs.Free;
   end;
end;


procedure ShredderAndDeleteFile(const filename:string);
var
   newname : string;
begin
   // zuerst umbennen, dann später keine Rückschlüsse auf den Dateinamen möglich sind
   newname := ExtractFilepath(Filename)+'$000000.tmp';

   if not RenameFile(Filename, newname) then
      raise Exception.CreateFmt('Can''t rename file %s', [filename]);

   ShredderFile(newname);

   DeleteFile(newname);
end;
Andreas
  Mit Zitat antworten Zitat