Avatar billede hensewg Nybegynder
27. marts 2008 - 16:15 Der er 17 kommentarer og
1 løsning

Undgå at læse .txt fil.

Hej eksperter,

Jeg har lavet et lille program, hvor der bruges et password som bliver hentet og gemt i et .txt dokument med denne kode:

F: TextFile;
begin
  AssignFile(F, 'C:\Delphi\test.txt');
  Reset(F);
  ReadLn(F, Password);
  CloseFile(F);
end;

procedure TForm1.GemFil;
var
  F: TextFile;
begin
Password := Edit4.text;
  AssignFile(F, 'C:\Delphitest.txt');
  ReWrite(F);
  WriteLn(F, password);
  CloseFIle(F);
end;

Mit problem er at man bare kan gå ind og læse koden i .txt filen, hvis man går ind i mappen hvor programmet ligger. Så er der ikke en måde, sådan man kan undgå dette? måske med en kryptering?

MvH. HenseWG
Avatar billede arne_v Ekspert
27. marts 2008 - 16:32 #1
Kryptering er nok en god ting.

Der findes jo mange muligheder: 3DES, AES etc..

Men skal der bare obfuskeres lidt saa:

function encrypt(tekst,kode:string):string;
var
  I: integer;
begin
  for I := 1 to length(tekst) do
  begin
    tekst[I] := chr(ord(tekst[I])+ord(kode[(I mod length(kode))+1]));
  end;
  result := tekst;
end;

function decrypt(tekst,kode:string):string;
var
  I: integer;
begin
  for I := 1 to length(tekst) do
  begin
    tekst[I] := chr(ord(tekst[I])-ord(kode[(I mod length(kode))+1]));
  end;
  result := tekst;
end;

og saa

WriteLn(F, encrypt(password, 'dinhemmeligekey'));

og

ReadLn(F, Password);
Password := decrypt(Passwortd, 'dinhemmeligekey');
Avatar billede erikjacobsen Ekspert
27. marts 2008 - 17:00 #2
Og pas på at du ikke regner med at alt er i orden, bare du krypterer den password-fil. Jeg kender ikke ønsket til din sikkerhed, men det password kan sikkert findes alligevel, på anden vis, uanset hvordan du krypterer din fil.
Avatar billede hensewg Nybegynder
27. marts 2008 - 19:42 #3
Hva mener du med "'dinhemmeligekey'"?
Avatar billede hensewg Nybegynder
27. marts 2008 - 19:45 #4
Og skriv det som et svar, sådan du kan få dine point.

MvH. HenseWG
Avatar billede arne_v Ekspert
27. marts 2008 - 21:15 #5
Det programmet bruger til at kryptere og dekryptere med.

Du kunne overveje nogle non-printable tegn for at undgå at folk dumper EXE filen og
læser key.

Som jeg antydede med "obfuskeres lidt" og som Erik Jacobsen understregede, så er dette
ikke ægte security - kun en simpel forhindring mod at læse password ved at type filen.

Og et svar.
Avatar billede arne_v Ekspert
27. marts 2008 - 21:15 #6
Om igen.
Avatar billede kroning Nybegynder
27. marts 2008 - 21:29 #7
Man kunne vel også lave dem med en MD5 streng, dvs. at man ud fra passwordet laver en MD5 streng som så gemmes i txt filen, på den måde står selve passwordet ingen steder og selv om man kikker direkte i EXE filen kan det ikke findes.
Avatar billede kroning Nybegynder
27. marts 2008 - 21:33 #8
Dvs. at hvis man glemmer sit password så findes der ingen mulighed for at finde det frem igen, eneste mulighed er at oprette et nyt password.
Avatar billede arne_v Ekspert
27. marts 2008 - 21:42 #9
At gemme som MD5 er rigtigt godt hvis det kun skal bruges til at checke et password
med. Men man kan ikke hente det og bruge det til et andet program.
Avatar billede hrc Mester
27. marts 2008 - 22:20 #10
En mulighed, på linje med arnes "obfusk" er, at køre det gennem UPX-pakkeren. Dermed pakkes exe-filen (fylder 20-30% af oprindelig størrelse) og der kan intet læses ud fra den. Når programmet køres, pakkes det ud direkte til hukommelsen og man mærker overhovedet ikke operationen - i nogle situationer vil man måske endda mærke en forbedring af starthastigheden.

Sikkerheden vil være god hvis det forudsættes at brugeren intet kender til UPX.
Avatar billede hrc Mester
27. marts 2008 - 22:30 #11
Det betyder at du skal linke din txt-fil til exe-filen og via LoadRessource hente oplysningerne. Du skal lave en rc-fil hvori du angiver txt-filen, oversætte den vha brcc32 og inkludere den i dit program vha. {$R <filnavn>}.

Det bliver aldrig en pæn løsning. Prøv i stedet at installere denne pakke:

  http://www.cityinthesky.co.uk/cryptography.html

Heri er hvad du har brug for af hasher, phasers og hvad ved jeg. Det er den pakke jeg plejer at bruge.
Avatar billede kroning Nybegynder
28. marts 2008 - 01:52 #12
Hvis du vil bruge MD5 og har Indy installeret så findes der allerede en MD5 funktion i denne.
Avatar billede hensewg Nybegynder
28. marts 2008 - 07:46 #13
Tak for alle henvendelserne, der er masser at tage fat i.

Smid svar, så i kan dele point.

Mvh. HenseWG
Avatar billede hensewg Nybegynder
28. marts 2008 - 13:04 #14
hrc, kunne jeg måske få dig til at sende en form for "Step-by-step" guide, om hvordan man bruger DCPcrypt til min mail (hvg@hense.dk) da jeg aldrig har brugt trejde-parts komponenter/software?
Avatar billede hensewg Nybegynder
28. marts 2008 - 20:41 #15
Jeg har fået UPX til ay du'.
Avatar billede hensewg Nybegynder
28. marts 2008 - 21:08 #16
**Jeg har fået UPX til at fungere.
Avatar billede hensewg Nybegynder
29. marts 2008 - 21:39 #17
der er ikke nogen der har lagt svar. Arne får point og denne tråd er lukket.
Avatar billede hrc Mester
30. marts 2008 - 19:09 #18
Jeg fandt lidt kode her. Det er fra login-delen i et meget gammelt program jeg stykkede sammen. Ville måske lave det anderledes i dag. Fordelen med eksemplet er, at  objekterne oprettes og slettes i proceduren. Her er det hele samlet.

Har noget simplere liggende et eller andet; sender når jeg finder.

procedure TBookClass.ReadBook(aTreeView : TTreeView; aExpandTree : boolean);
var
  bLoginOK : boolean;

  // To test that I've written what I intended...
  procedure DumpUncrypted(aStream : TStream);
  var
    OldPos : integer;
    TestStream : TFileStream;
  begin
    TestStream := TFileStream.Create(fFileName + '.dmp',fmCreate);
    try
      OldPos := aStream.Position;
      aStream.Position := 0;
      TestStream.CopyFrom(aStream,aStream.Size);
      aStream.Position := OldPos;
    finally
      TestStream.Free;
    end; // try
  end;

var
  BookStream : TFileStream;
  CryptStream : TMemoryStream;
  TreeNode : TTreeNode;
  Iterations : integer;
  frmLogin : TfrmLogin;
begin
  if not FileExists(fFileName) then
    raise exception.CreateFmt('Password library %s was not found',[fFileName]);

  bLoginOK := false;
  Iterations := 0;

  frmLogin := TfrmLogin.Create(Application.MainForm);
  try
    repeat
      inc(Iterations);

      if frmLogin.ShowModal = mrOK then begin
        fLoginUser := frmLogin.User;
        fLoginPwd := frmLogin.Pwd;
      end // if
      else
        raise ECancelException.Create('Cancelled opening password library');

      fMonster := TDCP_blowfish.Create(nil); // The infamous cryptation object

      BookStream := TFileStream.Create(fFileName,fmOpenRead);
      CryptStream := TMemoryStream.Create;
      aTreeView.Items.BeginUpdate;
      try
        try
          aTreeView.Items.Clear;

          {$ifdef CRYPT}
            fMonster.InitStr(fLoginUser+fLoginPwd,TDCP_sha1);
            fMonster.DecryptStream(BookStream,CryptStream,BookStream.Size);

          {define debug}
          {$ifdef debug}
            DumpUncrypted(CryptStream);
          {$endif}

            fMonster.Burn;
            CryptStream.Position := 0;
            Traverse(CryptStream, nil);
          {$else}
            BookStream.Position := 0;
            Traverse(BookStream, nil);
          {$endif}

          TreeNode := aTreeView.Items.GetFirstNode;
          if aExpandTree and assigned(TreeNode) then
            TreeNode.Expand(true);
        except // Ignore exceptions... I think...
          on E: ECancelException do
            raise;
        end; // try
      finally
        aTreeView.Items.EndUpdate;
        CryptStream.Free;
        BookStream.Free;
        fMonster.Free;
      end; // try
    until bLoginOK or (Iterations = 3);
  finally
    frmLogin.Free;
  end; // try
  if not bLoginOK then
    Raise exception.Create('There has been 3 unsuccessfull attempts and'#13#10+
                          'opening the book has been cancelled');
end;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester