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;