27. marts 2008 - 16:15Der 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?
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 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.
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.
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.
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.
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:
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?
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.
// 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]);
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
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;
Synes godt om
Ny brugerNybegynder
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.