Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Key für Verschlüsselung (https://www.delphipraxis.net/10260-key-fuer-verschluesselung.html)

Tifoso 14. Okt 2003 20:46


Key für Verschlüsselung
 
Hallo zusammen,

ich möchte Daten verschlüsslet in ein ini-file schreiben, jetzt schaut die verschlüsselung bei mir so aus:

Delphi-Quellcode:

CryptStr:=Encrypt(DCP_rijndael1,Edit1.Text,'DELPHI');
// Verschlüsselung der Mitliedernummer

PA:=Decrypt(DCP_rijndael1,Edit1.Text,'DELPHI');
// Entschlüsselung der Mitgliedernummer
Es klappt eigentlich alles.
Aber es macht keinen Sinn, wenn ich das ganze verschlüssle aber den Key im Klartext ('DELPHI') schreibe.
hat jemand eine gute Idee??

vielen Dank

Jelly 14. Okt 2003 20:57

Re: Key für Verschlüsselung
 
Tja,
das leidige Problem dem ich vor einigen Wochen auch noch hinterher geeifert bin. Um es einfach auszudrücken: Nein, es geht nicht anders. Es sei denn du greifs auf asynchrone Verfahren mit privaten und öffentlichen Schlüsseln zurück, wie das z.B. das Tool PGP einfach demonstriert. Ist aber in den meisten unsinnig in der Handhabung und nicht zu verwenden. Es bleibt dir also nur übrig die Passphrase irgendwie gut vor fremden Einblicken zu schützen.

Wenn du auf eine Entschlüsselung verzichten kannst, dann benutze einfach eine Hash Funktion wie MD5 z.B.

Gruß,
Tom

Tifoso 14. Okt 2003 21:14

Re: Key für Verschlüsselung
 
und wie soll ich die Passphrase gut verstecken??

Grüsse

himitsu 14. Okt 2003 21:39

Re: Key für Verschlüsselung
 
nimm keine Wörter: Sonderzeichen und so bieten sich da gut an, der Zeichensatz ist doch groß genug

und dann kann man noch das Passwort über den Quelltext verteilen

sei einfach etwas kreativ

Tifoso 14. Okt 2003 22:24

Re: Key für Verschlüsselung
 
hääää???

wie willst du den das über den ganzen Quelltext verteilen?
was mache ich wenn ich in einem andere unit das gleiche Phasphrase brauche, wie bringe ich eine var in eine andere unit?

danke und sorry wegen den blöden fragen die ich habe!! :angle:

nTE 14. Okt 2003 22:26

Re: Key für Verschlüsselung
 
Die einzige Methode die Sicherheit bietet (und mir einfällt ;) ist eben die eines nicht hardgecodeten Passworts.
Wenn du die Daten also sicher verschlüsseln willst, solltest du (und ggf. der User, wenn es nicht nur privat ist) ein Masterpasswort festlegen können, welches dann per Hash gespeichert wird (muss es auch nicht mal zwangsläufig, aber das würde alles noch etwas komplizierter machen ;) und bei Programmstart abgefragt wird.
Ist das Passwort falsch, können die Daten nicht entschlüsselt werden.

Ein hardgecodetes Passwort kann sowieso schnell herausgefunden werden, vor allem wenn es sich von Version zu Version nicht ändert (was ja aus Kompatibilitätsgründen praktischer wäre), ist es relativ nutzlos.


Natürlich kann man vieles gut verstecken, da gebe ich himitsu recht.
Wie er schon gesagt hat, sei einfach kreativ.

Ich glaube einige hier würden sich freuen wenn du das Programm mal postest und die Aufgabe stellst das Passwort zur Ver-/Entschlüsselung zu knacken. So könntest ein Feedback über den Schwierigkeitsgrad erhalten. Aber mach dir bitte keine Illusionen was die Sicherheit hardgecodeter Passwörter betrifft.

Fakt ist eins, wenn dein Programm es ohne äussere Eingaben schafft die Datei zu entschlüsseln, dann kann jeder der Lust hat, deinem Programm dabei zuschauen und sich einfacherweise sogar die Routine rauskopieren (ASM zwar, aber das ist ja nicht so schlimm).

himitsu 14. Okt 2003 23:07

Re: Key für Verschlüsselung
 
Na gut, es über den gesamten Code zu verteilen ist vielleicht etwas übertrieben. Wollte damit nur sagen, je weiter die einzelnen Stückchen verstreut sind, desto besser ist es.

Reicht aber auch schon aus, wenn du zum Beispiel die Passphrase erst am Ende einer Prozedur benötigst, dieses über diese Prozedur zu verteilen.

Wie schon erwähnt, bekommt man das einfach nicht sicher. Du kannst nur die Suche erschweren.

Luckie 14. Okt 2003 23:24

Re: Key für Verschlüsselung
 
Sicher wird es nur mit eoner one-way Verschlüsselung, sprich man hasht das Passwort und bei der Eingabe wird das eingegeben Passwort "gehasht" und mit dem gespeicherten Hash verglichen.

negaH 14. Okt 2003 23:55

Re: Key für Verschlüsselung
 
Zitat:

Sicher wird es nur mit einer one-way Verschlüsselung, sprich man hasht das Passwort und bei der Eingabe wird das eingegeben Passwort "gehasht" und mit dem gespeicherten Hash verglichen
Was bedeutet das ein Angreifer sein eigenes Passwort mit der gleichen Funktion hasht, und das gespeicherte Benutzerpasswort mit diesem Hash ersetzen kann. Somit hat nun der Angreifer Zugriff.

Nein, ein Passwort gehört in das Hirn und mit diesem Passwort werden alle Daten verschlüsselt. Nur wer dieses Passwort beim Start der Anwendung eingibt kann die Daten entschlüsseln. Die Sicherheit besteht dann nur noch aus der Fragestellung "Wie gut ist das benutzte Passwort ansich". D.h. ein Passwort wie "A" ist schlecht, aber ein Passwort wie "Die Frage hier ist nicht Sein oder Sein, da 5 * 3 = 17 und somit grün" kann man als sicher ansehen. (nungut, nun natürlich nicht mehr da ihr es kennt).

D.h. Passwörter sollten wenn überhaupt nur in einbruchssichere Hardware gespeichert werden, ansonsten nur im Kopf. Da hilft auch keine Public Key Verschlüsselung wie mit OpenPGP, denn auch dort muß zur Entschlüsselung der Private Key benutzt werden. Dieser sollte immer per Passwort verschlüsselt gespeichert werden. Diese Passwort muß also ebenfalls zur Entschlüsselung beim Benutzer abgefragt werden. Der EINZIGSTE Vorteil mit PK's wäre der das man zur Verschlüsselung keine Passwortabfrage benötigt.

Logisch gesehen gibt es bei solchen Systemen keinerlei andere sichere Alternativen !

Ein Passwort in die EXE zu speichern ist so sicher wie überhaupt nicht zu verschlüsseln. Ein Angreifer mit Zugriff auf die EXE kann dieses innerhalb von Stunden extrahieren. Dagegen gibt es keinerlei effektiven Schutzes, falls keine zusätzliche Hardware benutzt wird.
Wird diese EXE noch vertrieben ohne dieses Passwort für jede Kopie jedesmal zu ändern, dann ist dieser "Schutz" eher unsicherer als überhaupt nicht zu verschlüsseln. Unverschlüsselt beträgt die Sicherheit 0 Prozent. Mit einmaligem EXE gespeicherten Passwort beträgt die Sicherheit 0% - x%, wobei x% die durch den Benutzer suggerierte und angenommene Sicherheit ist die nicht existiert.
D.h. der Benutzter glaubt sich ziemlich sicher, angenommen zu 90%. Da dies definitiv nicht der Fall ist ist die effektive Sicherheit -90%, und fügt MEHR Schaden zu als ohne vorgetäuschte Sicherheit.

Gruß Hagen

Tifoso 16. Okt 2003 05:16

Re: Key für Verschlüsselung
 
also da ist das unit mit der verschlüsselung aber ich dänke ich lasse es so weil meine Anwendung keine super hohe sicherheit aufweisen muss.
oder hat vielleicht jemand eine einfache und schnelle Lösung?

Delphi-Quellcode:
procedure TPasswordDlg1.OKBtnClick(Sender: TObject);
var ini: TIniFile;
     PB: string;
     PA: string;
     CryptStr: string;
begin

    ini:=TIniFile.create(ExtractFilePath(ParamStr(0))+'test.ini');

    PB:=ini.ReadString('Benutzer','Passwort',PB);
    // Auslesen des Benutzer-Passwortes
     
    PA:=ini.ReadString('Administrator','Passwort',PA);
    // Auslesen des Administrator-Passwortes

    PA:=Decrypt(DCP_rijndael1,PA,'DELPHI');
    // Entschlüsselung des Administrator-Passwortes

    PB:=Decrypt(DCP_rijndael1,PB,'DELPHI');
    // Entschlüsselung des Benutzer-Passwortes

    IF ((AltesPassword.Text = PB) OR (AltesPassword.Text = PA)) THEN BEGIN
    // entweder das Benutzer-Passwort oder das Administratorpasswort stimmt

           IF (NeuesPassword.Text = NeuesPassword1.Text) THEN BEGIN
           // stimmen Passwort und Sicherheitseingabe

              CryptStr:=Encrypt(DCP_rijndael1,NeuesPassword.Text,PA);
              // Verschlüsselung der Mitliedernummer

              ini.WriteString('Benutzer','Passwort',CryptStr);
              // Schreibt das Neue Passwort ins ini-File

              AltesPassword.Text:='';
              NeuesPassword.Text:='';
              NeuesPassword1.Text:='';
              END ELSE

           ShowMessage('Sie haben das neue Passwort falsch eingegeben');
           AltesPassword.Text:='';
           NeuesPassword.Text:='';
           NeuesPassword1.Text:='';
    END ELSE

    ShowMessage('Sie haben das alte Passwort falsch eingegeben');
    AltesPassword.Text:='';
    NeuesPassword.Text:='';
    NeuesPassword1.Text:='';
    ini.free;
end;

mfg


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 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