Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Passwort-Fenster vor einem Programm


oneP - Di 18.08.09 00:52
Titel: Passwort-Fenster vor einem Programm
Hallo!

ich möchte, wie der Titel schon sagt, dass vor dem Start meines Programms ein kleines kennwortfenster erscheint.

Ich habe mir das so vorgestellt (ein ganz einfaches Beispiel:)
Es gibt zwei units (Hauptfenster und Passwortfenster)

Beim Start des Programms soll das Passwortfenster vom Hauptf. aufgerufen werden:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
unit Hauptfenster;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

uses Passwortfenster;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form2.showmodal;
end;

end.


wenn man diesen Aufruf-Befehl unter FormCreate eingibt, wie ich das hier gemacht hab, dann erscheint nach dem Start des Programms aber ein fehler. ('Fehler in Adresse....')
Was ist Falsch daran?

außerdem will ich das so machen dass am Anfang nur das Kennwortfenster erscheint, und erst nach der Eingabe des Kennworts das 'Hauptfenster' also das eigentliche Programm gestartet wird.
Wie stell ich das an?
Kann mir da jemand helfen?


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Di 18.08.2009 um 00:59


elundril - Di 18.08.09 01:15

warum nimmst du nicht das passwort-Form als hauptform, das dann einfach dein eigentliches Programm aufruft wenn das Passwort richtig eingegeben wurde?

lg elundril


oneP - Di 18.08.09 01:30

dann hab ich aber wieder das Problem dass ich, nachdem das Hauptfenster geöffnet wurde, das Kennwortfenster nicht schließen kann (zB durch Form1.close) weil dann das ganze Programm geschlossen wird.
Oder geht das irgendwie?


Delete - Di 18.08.09 03:51

- Nachträglich durch die Entwickler-Ecke gelöscht -


delphijanka - Di 18.08.09 14:53

Kreiert man eine Passwort-Form bei der OnShow der MainForm (Öffnen mit ShowModal!), so wird die MainForm erst nicht angezeigt, jedoch die Password-Form. Aus der Password-Form kann man jedoch in die MainForm zugreifen, um die Benutzereingaben (Username, Password) auf Richtigkeit zu prüfen. Mit Schliessen des Passwort-Fensters einfach Close; schreiben, mit Schliessen der gesamten Anwendung MainForm.Close;


thepaine91 - Di 18.08.09 16:50

Der Vorschlag mit Hide ist alleine deswegen schlecht da das Formular dann unsichtbar und ungenutzt in der gegend rumfliegt ^^.
Der ansatz von delphijanka hört sich schon viel besser an. Je nach erzeugung des Formulars auch wieder auf die Freigabe achten...


Delete - Di 18.08.09 20:07

- Nachträglich durch die Entwickler-Ecke gelöscht -


thepaine91 - Di 18.08.09 22:06

Frühlingsrolle er gibt aber nicht an wie lange die Anwendung läuft. Und es ist einfach unsauber und wenn man das öfter in einer größeren Anwendung macht dann wird die Problematik noch offensichtlicher. ;)


Narses - Di 18.08.09 22:50

Moin!

user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
Frühlingsrolle er gibt aber nicht an wie lange die Anwendung läuft. Und es ist einfach unsauber und wenn man das öfter in einer größeren Anwendung macht dann wird die Problematik noch offensichtlicher. ;)
Ich schmeiße mal das Wort "Verhältnismäßigkeit" in die Diskussion. Was schätzt du denn, wieviele verschiedene, gleichzeitig geöffnete aber versteckte Passwort-Dialoge er so in dieser Anwendung verwenden wird? :zwinker:

cu
Narses


Delete - Di 18.08.09 23:19

- Nachträglich durch die Entwickler-Ecke gelöscht -


oneP - Mi 19.08.09 01:08

Der tipp von delphijanka war eigentlich das wonach ich gesucht hab. Das OnShow Ereignis öffnet das Passwort fenster als 'Nebenfenster', genauso wie ich das gewollt hab. Nur leider hab ich das OnShow Ereignis vorher nicht entdeckt... :D

und zum Thema Passwort möcht ich noch fragen ob es eine sichere Möglichkeit gibt als es in einer ini Datei zu speichern? Vielleicht so dass man es gar nicht in einer datei speichern muss??

und wie lass ich das Passwort bei der Eingabe nur als Punkte erscheinen?


Delete - Mi 19.08.09 02:01

- Nachträglich durch die Entwickler-Ecke gelöscht -


thepaine91 - Mi 19.08.09 08:54

Narses da hast du schon recht nur wenn man so denkt ist immer die Frage wo die grenze ist. OT: Wenn man ein Loli klaut bleibt es auch Diebstahl.

Ich finde man sollte das von Anfang an einhalten. Aber nur meine meinung daher beuge ich mich jetzt. :P

Onep: du könntest es in der registry speichern u.a. und dazu 100* md5 verschlüsseln. ;)


delphijanka - Mi 19.08.09 09:27

@OneP

Bitte beachten: dein Anmelde-Fenster darf nicht einfach so mit Alt-F4 oder ähnlichem geschlossen und damit der Anmeldevorgang umgegangen werden. Zur Lösung des problems einfach eine boolean-Variable in der Anmelde-Unit deklarieren, die, je nach Status, entweder nur Anmeldefenster schleisst, oder das gesamte Programm. Erfolgreicher Anmeldevorgang würde bedeuten, den Wert dieser Variable zu ändern.


delphijanka - Mi 19.08.09 09:37

@OneP schreibt:

"und zum Thema Passwort möcht ich noch fragen ob es eine sichere Möglichkeit gibt als es in einer ini Datei zu speichern? Vielleicht so dass man es gar nicht in einer datei speichern muss??"

Normalerweise werden die pw's encodiert und "irgendwo" abgelegt. Das Encode- sowie Decodeverfahren sind direkt in das Programm integriert.


oneP - Mi 19.08.09 11:30

Frühlingsrolle danke für den Tipp hab ich gleich gemacht. Mit Punkt meinte ich den da: ••••



user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:


Onep: du könntest es in der registry speichern u.a. und dazu 100* md5 verschlüsseln. ;)


??? Kapier ich nicht.... :D also dieses Verschlüsseln



user profile icondelphijanka hat folgendes geschrieben Zum zitierten Posting springen:
@OneP

Bitte beachten: dein Anmelde-Fenster darf nicht einfach so mit Alt-F4 oder ähnlichem geschlossen und damit der Anmeldevorgang umgegangen werden. Zur Lösung des problems einfach eine boolean-Variable in der Anmelde-Unit deklarieren, die, je nach Status, entweder nur Anmeldefenster schleisst, oder das gesamte Programm. Erfolgreicher Anmeldevorgang würde bedeuten, den Wert dieser Variable zu ändern.


danke auch. habs jetzt auch so gemacht :D

user profile icondelphijanka hat folgendes geschrieben Zum zitierten Posting springen:
@OneP schreibt:

Normalerweise werden die pw's encodiert und "irgendwo" abgelegt. Das Encode- sowie Decodeverfahren sind direkt in das Programm integriert.


Hmm.. das is mir aber zu umständlich :D. Ich mache das Programm nur so als Übung...

ALSO DANKE NOCHMAL AN ALLE


Gewuerzgurke - Di 25.08.09 15:52

Wobei anzumerken ist, dass man nicht das Passwort verschlüsseln sollte sondern dieses selber als Schlüssel für einen zufällig erzeugten Ausdruck verwenden sollte. Denn so kennt das Programm das Passwort garnicht, sondern kann nur prüfen, ob der zufällig erzeugte Ausdruck korrekt entschlüsselt wurde.

Ich suche schon seit Tagen nach vernünftigen Tutorials und Quellcode für solche Verschlüsselungen wie z.B. AES. Hat jemand ein Paar Tipps?


elundril - Di 25.08.09 16:27

Das DEC von Hagen (username: negaH) aus der Delphi-Praxis wäre zum beispiel so ein Quellcode. Da sind unter anderem AES, MD5 und weitere dabei. Jedoch sind diese Units nicht kommerziell nutzbar, da von der lizenz her verboten.

lg elundril


thepaine91 - Di 25.08.09 17:00

Ich muss mich korrigieren.
md5 ist lediglich ein Hashwert nicht zu verwechseln mit einer Verschlüsselung.
Wenn du natürlich intern im Programm den Hashwert errechnest und den in eine Ini speicherst ist das nicht weiter kompliziert.
Für den Normalen nutzer wird das reichen für jemanden mit genügend Fachkenntnissen nicht.


ffgorcky - Sa 29.08.09 11:06

Das geht doch auch schon so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.FormCreate(Sender: TObject);
begin
if InputBox('Passwortabfrage','Bitte zum Start das erforderliche Passwort eingeben:','')='Hallo' then
        Form1.Show
else
        Application.Terminate;
end;