Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Passwortverschlüsselung (https://www.delphipraxis.net/157448-passwortverschluesselung.html)

arest 12. Jan 2011 13:07

Passwortverschlüsselung
 
hallo an alle,

leidiges thema und schon hundertfach diskutiert.. sorry dafür! dennoch die frage, da mir die sufu nicht so richtig weiter hilft :(
ich habe einen datensatz, den ich über nachfolgende funktion in eine datei abspeichere:
Code:
procedure TForm1.Listespeichernunter1Click(Sender: TObject);
var Datf:File of TDaten;
Daten1:TDaten;
begin
      aenderung:=false;
      Edit1.Clear;
      lauf:=TKnoten.Init;
      if SaveDialog1.Execute
      then begin
              dateiname:=SaveDialog1.FileName;
              if copy(dateiname,length(dateiname)-3,4)<>'.mbf'
              then begin
                      dateiname:=dateiname+'.mbf';
                   end;
              Assignfile(Datf,dateiname);
              Rewrite(Datf);
              lauf:=anfang;
              repeat lauf:=lauf.nachfolger;
                 if (lauf <> ende)
                 then begin
                         write(Datf,lauf.Daten);
                      end;
              until (lauf.nachfolger=ende);
              closefile(Datf);
           end;
end;
wie euch sicherlich aufgefallen ist, speichert das in normal lesbarer version alle datensätze aus meiner liste. ich möchte nun, dass diese daten verschlüsselt abgespeichert werden und bei meiner datei öffnen funktion nur dann korrekt eingelesen werden, wenn das mitgespeicherte und ebenfalls verschlüsselte passwort korrekt eingegeben wurde... (bei meiner speichermethode kann die datei logischerweise einfach per wordpad geöffnet und gelesen werden)

muss ich dabei wirklich so aufwändig werden, wie in einigen schon vorhandenen posts besprochen wurde? oder kann man das auch einfacher haben? ich brauch da nicht unbedingt eine 128bit verschlüsselte file.. es soll bloß für den normalen user, der die file halt per wordpad öffnet nicht mehr lesbar sein und in meinem programm halt nur bei korrekter eingabe entschlüsselt werden!

danke für alle beiträge vorab!
greedings

Deep-Sea 12. Jan 2011 13:53

AW: Passwortverschlüsselung
 
Zitat:

Zitat von arest (Beitrag 1074131)
[...] wenn das mitgespeicherte und ebenfalls verschlüsselte passwort korrekt eingegeben wurde...

Eine weitaus bessere Idee ist es, das Passwort nicht in der Datei zu speichern, sondern es zu hashen und den Hash als Schlüssel für deinen Verschlüsselungsalgorithmus zu nutzen. Wenn man zum öffnen nun ein falsches Passwort eingibt, entschlüsselst du nur Müll. Andernfalls müsstest du ja mit einem festen Schlüssel (:shock:) die Daten in den Klartext bringen, bevor du prüfen kannst, ob der Nutzer leseberechtigt ist - nicht sonderlich sicher.

PS: Was hast du gegen Chiffren mit einem 128-bit Schlüssel? Viel kleiner kannst du eh nicht werden, denn außer den veralteten DES und einigen Stromchiffren gibt es eig. nichts gescheites, was weniger hat.

arest 12. Jan 2011 14:51

AW: Passwortverschlüsselung
 
krass was ein amok denkfehler meinerseits.. ist ja logisch, dass das so nicht gehen könnte^^ danke dafür schonmal

wie funktioniert das mit dem hashen denn? ich würd es dann jetzt so verstehen, dass ich meinen normalen inhalt ausm programm durch irgend eine form von verschlüsselung unlesbar abspeichere und das passwort gehashed(?!) mit hinterlegt wird.. hat jemand dazu was in ein paar zeilen code?

thx

Klaus01 12. Jan 2011 14:57

AW: Passwortverschlüsselung
 
.. nein, der Schlüssel bzw. das Passwort wird nirgendwo hinterlegt.

Der User gibt ein Passwort ein, dein Programm erstellt daraus einen Hash
(Stichwort md5, sha1). Der Hash wird dann zum ver- und entschlüsseln hergenommen.

Grüße
Klaus

Deep-Sea 12. Jan 2011 15:00

AW: Passwortverschlüsselung
 
Es war anders gemeint, so wie Klaus01 schon sagte.

Speichern:
  1. Benutzer gibt das Passwort ein
  2. Passwort mit einem Hash hashen (dessen Ausgabegröße im Idealfall genau zur Schlüssellänge deines Verschlüsselungsalgorithmus passt)
  3. Den Hash als Schlüssel setzen
  4. Die Daten verschlüsseln und in eine Datei speichern

Das Passwort existiert somit nirgendwo mehr.
Das Laden geht erst einmal genau so, nur dass du in Punkt 4 natürlich die Daten lädst und entschlüsselst.
Außerdem sollte man natürlich aufpassen, dass man ja einen verketteten Modus für die Blockchiffre nimmt (sofern man sich für eine entscheidet) und am besten auch jedes mal einen neuen Initialisierungsvektor nutzt.

arest 12. Jan 2011 15:10

AW: Passwortverschlüsselung
 
ich hab mal bei der sufu nach md5 und sha1 gekramt, aber ich versteh da nur bahnhof... ich bin schon eher so nen ziemlicher amateur beim coden und das überfordert mich dann doch ziemlich^^ prinzipiell check ich was ihr von mir wollt, aber wie ich das in zeilen umsetzen soll hab ich keinen plan :X evtl erbarmt sich jemand und hilft mir mit n bisschen code weiter? bzw. ein link zu nem entsprechenden eintrag in irgend nem forum, aus dem auch ein nichtskönner schlau wird? :D

Deep-Sea 12. Jan 2011 15:15

AW: Passwortverschlüsselung
 
Such mal nach DEC. Dort sollten genug Algorithmen enthalten sein.
Wie es funktioniert? Gute Frage, ich nutze es nicht, aber auch da könnte dir die Sufu weiter helfen.

arest 12. Jan 2011 15:28

AW: Passwortverschlüsselung
 
wie gesagt, das ist mir alles ein bisschen hoch... ich begrab das "projekt" verschlüsseln dann einfach ;)

danke trotzdem an alle und falls doch noch jemand helfen mag, ich freue mich :D

Deep-Sea 12. Jan 2011 15:44

AW: Passwortverschlüsselung
 
Naja, schwer ist es nun nicht gerade.
Ein Beispiel, wie einfach es mit meinen eigenen Komponenten geht:
Delphi-Quellcode:
procedure TForm1.SaveFileButtonClick(Sender: TObject);
begin
  AES.Key.Assign(SHA256.Hash(PasswortEdit.Text)); // Passwort hashen und als Schlüssel zuweisen
  AES.EncipherTextFile('C:\test.txt', DatenMemo.Text); // Inhalt von DatenMemo in die Datei test.txt speichern
end;

procedure TForm1.OpenFileButtonClick(Sender: TObject);
begin
  AES.Key.Assign(SHA256.Hash(PasswortEdit.Text)); // Passwort hashen und als Schlüssel zuweisen
  DatenMemo.Text := AES.DecipherTextFile('C:\test.txt'); // Datei test.txt laden und deren Inhalt DatenMemo.Text zuweisen
end;
(SHA-256 als Hash, AES als Verschlüsselung.)

Hier fehlt eig. nur noch, beim Speichern einen IV zu setzen. Ansonsten ist es vollkommen einsatzbereit :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:17 Uhr.

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