Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Verschlüsslung - Daten ungeschützt im RAM (https://www.delphipraxis.net/96742-verschluesslung-daten-ungeschuetzt-im-ram.html)

Van HelF 30. Jul 2007 11:43


Verschlüsslung - Daten ungeschützt im RAM
 
Hallo, ich benutze die DCPCrypt Komponenten um eine (text)datei zu verschlüsseln.
Nun ist mir aber aufgefallen, dass immer wenn ich die datei entschlüssele die daten im RAM liegen und das obwohl ich diese direkt verschlüsselt in einer stringlist speichere.
Dann ist mit aufgefallen, dass immer wenn ich die Decrypt prozedur aufrufe die daten im RAM liegen bleiben, auch das freigeben der DCP Komponenten löscht die daten nicht. Weiss jemand rat?

Hier der verwendete Code:

Delphi-Quellcode:
procedure decrypt(t:Tstrings;AESKey:string);
var
  i: integer;
  s: string;
  Cipher : TDCP_rijndael;
begin
  try
    Cipher :=TDCP_rijndael.create(nil);
    Cipher.InitStr(AESKey);
    t.Text:=HexStrToString(t.Text);
    for i:= 0 to t.Count-1 do
    begin
      s:=B64Decode(t.strings[i]);
      Cipher.DecryptCFB(S[1],S[1],Length(S)); <- ab hier liegen die daten im RAM
      t.strings[i]:= s;
    end;
    Cipher.Reset;
    Cipher.Burn;
  finally
    Cipher.free;
  end;
end;

sirius 30. Jul 2007 12:44

Re: Verschlüsslung - Daten ungeschützt im RAM
 
Die Speicherstelle überschreiben, was sonst.
Beim löschen von dynamischen Komponenten wird der speicherplatz nicht automatische mit Nullen überschreiben. Überhaupt gibt es für ein Byte im speicher ja keinen undefinierten Zustand. Wenn du den Speicherplatz verändern willst, musst du selber was drüberschreiben z.B. mit Fillchar.
Ob du jetzt in die Komponente reinkommst weis ich nicht. Aber dein Decrypteter Text liegt ja (soweit ich das sehe) auch in s und in t.strings[i] vor. Wenn du damit arbeiten willst, musst du ihn nunmal irgendwann entschlüsselt rumliegen haben.

franktron 30. Jul 2007 12:58

Re: Verschlüsslung - Daten ungeschützt im RAM
 
Versuch mal

Delphi-Quellcode:
  FreeAndNil(Cipher);
Statt Nur Cipher.Free;

gammatester 30. Jul 2007 13:05

Re: Verschlüsslung - Daten ungeschützt im RAM
 
Zitat:

Zitat von franktron
Versuch mal

Delphi-Quellcode:
  FreeAndNil(Cipher);
Statt Nur Cipher.Free;


Davon wird der Inhalt von s nicht gelöscht! Der "String" auf dem Stack dürfte nur ein (erweiterter) Zeiger sein. Also vielleicht noch

Code:
for i:=1 to length(s) do s[i] := #ff;
Gruß Gammatester

xaromz 30. Jul 2007 13:09

Re: Verschlüsslung - Daten ungeschützt im RAM
 
Hallo,

wenn Du Speicher sicher überschreiben willst, solltest Du darauf achten, dass der Speicher nicht ausgelagert wird. Ansonsten steht der Text ja auch in der Auslagerungsdatei. Du musst also den angeforderten Speicher "festpinnen", und nach der Verarbeitung überschreiben. Hierfür gibt es spezielle Befehle in der Windows-Speicherverwaltung.

Gruß
xaromz

Matrix Scripter 2. Aug 2007 15:05

Re: Verschlüsslung - Daten ungeschützt im RAM
 
in den beispielen hab ich mal etwas von cipher.burn gelesen. könnte es das sein?
und btw. wie installiert man dcpcrypt denn unter turbo delphi explorer? bzw wie nutzt man es? muss man irgendwas kompilieren? welche unit muss man einbinden? :?:

OG Karotte 2. Aug 2007 15:56

Re: Verschlüsslung - Daten ungeschützt im RAM
 
Wenn ich mich recht entsinne, brauchst Du nur das Projekt (DCPCrypt) kompilieren (installieren der Komponenten funktioniert eh nicht in der Freeware Version des Turbo Explorer's). Natürlich müssen die Pfade zu den DCPCrypt-Verzeichnissen in den Optionen vom TE (Blibliothekspfad und Suchpfad) bzw. in den Projekt-Optionen deines Prog's gesetzt werden.
Anschliessend bindest Du nur noch die benötigten Units in ein entspr. Modul Deines Projekts ein:

Im folgenden wird zum Beispiel RC4 mit SHA1 verwendet:

Delphi-Quellcode:
unit MyCrypt;

interface
uses
 ..., DCPcrypt2, DCPrc4, DCPsha1;

...

implementation

...

function TCrypt.CodeData(const TheData:string; DoEncrypt:Boolean):string;
var
  Cipher: TDCP_rc4;
begin
  Result := '';
  if Trim(TheData) = '' then Exit;
  Cipher:= TDCP_rc4.Create(nil);
  Cipher.InitStr(myKeyPhrase, TDCP_sha1);// initialize the cipher with a hash of the passphrase

  ...

  FreeAndNil(Cipher);
end;
Eine Verwendung der Komponenten aus entspr. Palette ist also nicht notwendig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz