Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Passwortabfrage mit Datenbank abgleichen (https://www.delphipraxis.net/188594-passwortabfrage-mit-datenbank-abgleichen.html)

Thieon 18. Mär 2016 21:33

Datenbank: ?? • Version: ?? • Zugriff über: ??

Passwortabfrage mit Datenbank abgleichen
 
Moin zusammen,

ich bin kompletter Neuling, was das Programmieren angeht und ich versuche mich schon seit zwei Tagen an das Problem meine Passwortabfrage am laufen zu bekommen. Jetzt habe ich es soweit am laufen, dass er die Eingabe in den Feldern Ben (Benutzername) und Code (Kennwort) mit der Datenbank abgleicht. Jedoch Vergleicht das Programm die Einträge mit der ersten Zeile in der Datenbank und wenn ich einen anderen Benutzernamen wähle, dann passiert nichts.

Meine Prozedur sieht wie folgt aus:
Code:
//LoginButton = true Weiterleitung zum MainForm und schließen LoginFenster
procedure TForm1.BitBtn1Click(Sender: TObject);
 
begin
  if
    (Benutzer.text = form3.Dbf1.FieldByName('Ben').AsString)
  and
     (Code.Text = form3.Dbf1.FieldByName('Code').AsString)
  then
      begin
           form2.show;
           form1.close;
      end
end;
Benutzte Objekte:
TLabeledEdit für Benutzername und Kennwort
TBitBtn für den Login Button

Für die Datenbank habe ich folgende Objekte benutzt:
DGrid
DBNavigator
DataSource
Dbf

Ach ja kann man den FilePath automatisch setzten, so dass die Datenbank immer automatisch gefunden wird (anhand des TableName)?

Ich hoffe meine Angaben sind ausreichend...

Vielen Dank im Voraus

MfG

René

scrat1979 18. Mär 2016 21:44

AW: Passwortabfrage mit Datenbank abgleichen
 
Also...

Filepath und alle anderen Einstellungen kannst du zum Beispiel beim Programmstart im Event "OnFormCreate" zuweisen.

Für deine Passwortabfrage brauchst du kein DBGrid und kein Navigator. Nehme eine SQL-Query Komponente und prüfe so (Pseudocode)

Code:
SELECT *
FROM tblusers
WHERE Passwort='blablabla' AND username='username'
Dann würde ich nur mit SQLQuery.FetchedRows auf <> 0 prüfen.

Alternativ kannst du auch in der Query

Code:
SELECT count(id) As RecFound
FROM tblusers
WHERE ....
Die Anzahl der gefunden Übereinstimmungen berechnen und mittels FieldByName('RecFound').AsInteger <> 0 prüfen.

Schau dir mal die Einsteiger-Tutorials zu SQL und den DB-Komponenten an.

Thieon 18. Mär 2016 22:15

AW: Passwortabfrage mit Datenbank abgleichen
 
Erstmal Danke für deine schnelle Antwort.

Irgendwie kann ich damit nichts anfangen... Ich habe versucht dein Beispiel einzubinden, jedoch klappt das nicht... Ich nutze auch keine SQL Datenbank ich vermute mal das es damit zusammenhängt. Wenn ich ein SQLQuery einbinde dann kann ich dieses Objekt nicht mit meiner Datenbank verbinden. ...


Zitat:

Zitat von scrat1979 (Beitrag 1333322)

Code:
SELECT *
FROM tblusers
WHERE Passwort='blablabla' AND username='username'
Dann würde ich nur mit SQLQuery.FetchedRows auf <> 0 prüfen.

Alternativ kannst du auch in der Query

Code:
SELECT count(id) As RecFound
FROM tblusers
WHERE ....
Die Anzahl der gefunden Übereinstimmungen berechnen und mittels FieldByName('RecFound').AsInteger <> 0 prüfen.

Ach ja das DGrid und den Navigator brauche ich nicht für die Passwortabfrage aber die brauche ich doch zum pflegen der Datenbank...

Und noch eine Anmerkung, die ich vergessen habe...

Ich nutze kein Delphi sondern Lazarus, aber ich habe mir sagen lassen, dass zwischen Lazarus und Delphi kein Unterschied besteht außer die Kosten halt :lol:

Danke

René

nahpets 18. Mär 2016 22:46

AW: Passwortabfrage mit Datenbank abgleichen
 
Da mir nicht klar ist, was für eine Datenbank Du nutzt, versuch es mal so in der Form (nur hingedaddelt und nicht getestet):
Delphi-Quellcode:
//LoginButton = true Weiterleitung zum MainForm und schlie&#8730;üen LoginFenster
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  dbf1.Filtered := false;
  dbf1.Filter  := Format('Ben = %s and Code = %s',[QuotedStr(Benutzer.text),QuotedStr(Code.Text)]);
  dbf1.Filtered := true;
  dbf1.First;
  if not dbf1.EoF then begin
    form2.show;
    form1.close;
  end;
  dbf1.Filtered := false;
end;

Thieon 19. Mär 2016 05:50

AW: Passwortabfrage mit Datenbank abgleichen
 
Tausend Dank...:thumb:

Zitat:

Zitat von nahpets (Beitrag 1333325)
Da mir nicht klar ist, was für eine Datenbank Du nutzt, versuch es mal so in der Form (nur hingedaddelt und nicht getestet):
Delphi-Quellcode:
//LoginButton = true Weiterleitung zum MainForm und schlie&#8730;üen LoginFenster
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  dbf1.Filtered := false;
  dbf1.Filter  := Format('Ben = %s and Code = %s',[QuotedStr(Benutzer.text),QuotedStr(Code.Text)]);
  dbf1.Filtered := true;
  dbf1.First;
  if not dbf1.EoF then begin
    form2.show;
    form1.close;
  end;
  dbf1.Filtered := false;
end;

Genau das hat mein Problem gelöst... Ich verstehe zwar noch nicht ganz, warum die Filterfunktion ausgeschaltet sein muss und danach wieder eingeschaltet werden muss, aber ich nehme es erstmal so hin. :lol:

MfG

René

jobo 19. Mär 2016 07:51

AW: Passwortabfrage mit Datenbank abgleichen
 
Zunächst mal:
Normalerweise meldet man sich an der DB mit User/PW an. Dein Verfahren, auf einer geöffneten DB nach passenden Usern zu suchen erinnert eher an Mittelschicht Anwendungen, klassische Webserver, wie passt das zu einem Fatclient?
Für den Fall, dass dbf tatsächlich dbf ist und die "Datenbank" einfach so im Zugriff liegt, wofür brauchst Du Nutzer und Passwort, wenn sowieso jeder die "Datenbank" öffnen kann?

Die Filtered Sache:
Das Attribut gibt den Zustand an, bzw. ändert ihn bei Zuweisung. Der Filter(text) selbst ist natürlich nur wirksam, wenn Filtered True ist. Einen aktiven Filter ändert man nicht. Man schaltet auch den Motor aus, bevor man die Zündkerzem wechselt (und dann erst wieder an)

Ach und wie soll ein System anhand eines Tabellennamen wissen, wo die zugehörige DB liegt ohne in die DB reinzuschauen? Das geht nur wenn Du es definierst. TABA liegt auf C:\meinedb.dbf, TABB lieft auf c:\backup\meinedb.dbf usw.
Alternativ kannst Du nach DBF suchen und darin nach dem gewünschten Tabellennamen schauen.

nahpets 19. Mär 2016 08:08

AW: Passwortabfrage mit Datenbank abgleichen
 
Zitat:

Zitat von Thieon (Beitrag 1333329)
Ich verstehe zwar noch nicht ganz, warum die Filterfunktion ausgeschaltet sein muss und danach wieder eingeschaltet werden muss, aber ich nehme es erstmal so hin.

Probiere es aus, ob es ohne das Aus- und Einschalten geht. Wenn ja, dann lass es weg, wenn nein, dann schau, wie sich das Verhalten verändert.

Was passierte denn, wenn das erste Ausschalten entfällt, aber bereits ein Filter gesetzt ist?
Wird der Filter dann bereits bei der Zuweisung der "Filtertextes" entsprechend verändert?
Oder ist das Einschalten dann erforderlich?
Lässt sich ein veränderter Filter einschalten, wenn bereits ein anderer Filter eingeschaltet ist?
Was ist im DBGrid zu sehen, wenn ein Filter eingeschaltet ist?
Kann man dann noch per Navigator durch die Daten scrollen?

@Jobo:

Ich hab' auch eine "Datenbank", in der ich Benutzernamen und Passwörter für die verschiedenen "Systeme", auf die ich so im Laufe der Zeit zugreifen muss, verwalte.

Wenn ich halt mal wieder eine Anmeldung vergessen habe, so brauche ich nur Benutzername und Passwort der Anwendung, mit der ich die Benutzernamen und Passwörter verwalte und kann dann dort nachschauen, welchen Benutzernamen und welches Passwort ich gerade benötige.
Prinzipiell könnte es sich hier also schon um eine sinnvolle Anwendung halten.

Andererseits könnte man auf diese Weise aber auch eine Zugriffsverwaltung (mit Berechtigungskonzept) ähnlich verwalten.
Die Anwendung meldet sich an der Datenbank an, aber diese Anmeldung ist unabhängig davon, ob der Nutzer der Anwendung dann auch über die Anwendung Zugriff auf die Datenbank bekommt.

Wenn ich mich hier im Forum anmelde, dann muss ja auch "irgendwer" in 'ner Datenbank nachschauen, ob ich zugriffsberechtigt bin und wenn ja, mit welchen Rechten. Aber Benutzername und Passwort, für die hinter dem Forum liegenden Datenbank, sind mir vollkommen unbekannt. Und bei der Registrierung im Forum wird garantiert kein Benutzer (mit meinen Anmeldedaten) in der Datenbank anlegt.

Sir Rufo 19. Mär 2016 08:18

AW: Passwortabfrage mit Datenbank abgleichen
 
@nahpets

Dein Vergleich mit dem Forum ist das was @jobo mit Mittelschicht meinte. ;)

nahpets 19. Mär 2016 08:37

AW: Passwortabfrage mit Datenbank abgleichen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1333333)
@nahpets

Dein Vergleich mit dem Forum ist das was @jobo mit Mittelschicht meinte. ;)

Jain, die Form der Anwendung schon, wäre dann aber kein Fatclient.

Die Anwendung hier könnte quasi die Grundlage liefern, damit die Mittelschicht die Möglichkeit bekommt, Benutzernamen und Passwörter abzugleichen.

Die Mittelschicht muss nicht unbedingt selbst eine Option enthalten, mit deren Hilfe sie sich quasi selbst verwaltet.

Hier dürfte es sich eher um eine Verwaltung für Benutzernamen und Passwörter handeln, die halt zufällig die Daten in irgendeiner Tabelle irgendeiner Datenbank speichert.

Aber eigentlich egal: Die Informationslage ist wohl nicht aussagekräftig genug, um hier auf eine konkrete Anwendung schließen zu können ;-)

jobo 19. Mär 2016 08:41

AW: Passwortabfrage mit Datenbank abgleichen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1333333)
@nahpets

Dein Vergleich mit dem Forum ist das was @jobo mit Mittelschicht meinte. ;)


Ja, so meinte ich das.

Es kann natürlich sein, dass der TE eine Passwortverwaltung schreibt. Da kann man sich immer noch fragen, ob es Sinn macht in der Form.
Ich vermute eher, dass gemäß Selbstauskunft des TE hier noch einige Verständnisschwierigkeiten bestehen. Aber das kann er ja selbst fragen.

haentschman 19. Mär 2016 12:47

AW: Passwortabfrage mit Datenbank abgleichen
 
Moin...:P
[mein Senf am Rande]
... man speichert keine Passwörter im Klartext in der Datenbank sondern nur dessen Hash z.B. Damit geht auch kein Klartext über die Leitung. :wink:
[/mein Senf am Rande]

Thieon 19. Mär 2016 14:22

AW: Passwortabfrage mit Datenbank abgleichen
 
Wie kann ich den Ein Passwort als Hash speichern? Und meinst Du mit "über die Leitung" das Internet bzw, Netzwerk? Weil Das Programm soll lediglich lokal auf einer Maschine verwendet werden.

Zitat:

Zitat von haentschman (Beitrag 1333355)
Moin...:P
[mein Senf am Rande]
... man speichert keine Passwörter im Klartext in der Datenbank sondern nur dessen Hash z.B. Damit geht auch kein Klartext über die Leitung. :wink:
[/mein Senf am Rande]

Danke für den Hinweis.

MfG

René

mjustin 19. Mär 2016 16:32

AW: Passwortabfrage mit Datenbank abgleichen
 
Zitat:

Zitat von Thieon (Beitrag 1333357)
Wie kann ich den Ein Passwort als Hash speichern? Und meinst Du mit "über die Leitung" das Internet bzw, Netzwerk? Weil Das Programm soll lediglich lokal auf einer Maschine verwendet werden.

Auch wenn es eine lokale Datenbank ist, ist die Speicherung der Passwörter im Klartext unvorsichtig. Ein Grund: viele Benutzer verwenden aus Bequemlichkeit das gleiche Passwort auch an anderen (eventuell erheblich 'wertvolleren') Systemen. Damit hat ein Angreifer, der in den Besitz der Benutzernamen/Passwortkombination gelangt, ideale Voraussetzungen, um andernorts erfolgreiche Anmeldungen durchzuführen.

Es ist eine Grundregel: vertraue keiner Webseite (oder Anwendung), die dein Passwort im Klartext speichert. Firmen, die es dennoch tun, werden zum Beispiel unter http://plaintextoffenders.com/ genannt. Eine "Hall of Fame" ist das nicht :)

haentschman 19. Mär 2016 17:29

AW: Passwortabfrage mit Datenbank abgleichen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin...8-)
Zitat:

Und meinst Du mit "über die Leitung" das Internet bzw, Netzwerk?
...ja das meinte ich. Wie aber schon gesagt gehört Klartext nie in egal welche Datenbank.
Zitat:

Wie kann ich den Ein Passwort als Hash speichern?
* man verwende die angehängte Unit (Freeware) Copyright © 2002 by Dimka Maslov
Delphi-Quellcode:
procedure TLogin.Login(aUserName, aPassword: string); // aPassword = Klartext direkt ohne Umwege aus dem Eingabeedit
var
  MD5Password: string; // Hash
begin
  MD5Password := MD5DigestToStr(MD5String(aPassword));
  aPassword := '';
// Pseudocode:
// Query... frage die Datenbank ob es einen Benutzer(aUserName) mit dem MD5Passwort gibt.
// !!! Werte immer als Parameter der Query mitgeben.
// Hat die Query eine Antwort (Resultmenge = 1) ist der Benutzer gültig
// fertsch...
// Mach was mit dem User
end;
Beim Speichern des neuen Paßwortes erzeugst du auch den MD5, setzt die Paßwortvariable auf '' und speicherst den MD5 ab. Mit obiger Methode hast du im Programm keinen Vergleich der Paßwörter. Dieser läuft quasi schon in der Datenbank. Wenn du im Programm vergleichen willst dann nur die Hashes.

PS: Das ist eine einfache Variante aber ausreichend. Sicherer geht es immer... :wink:

Thieon 19. Mär 2016 18:19

AW: Passwortabfrage mit Datenbank abgleichen
 
Erstmal möchte ich mich für deine Hilfe bedanken... und selbstverständlich auch bei allen anderen, denen ich noch nicht geantwortet habe... Aber leider hatte ich heute dafür keine Zeit, da ich den ganzen Tag auf einen blöden BOS Lehrgang bin. ...

Zitat:

Zitat von haentschman (Beitrag 1333368)
* man verwende die angehängte Unit (Freeware) Copyright © 2002 by Dimka Maslov
Delphi-Quellcode:
procedure TLogin.Login(aUserName, aPassword: string); // aPassword = Klartext direkt ohne Umwege aus dem Eingabeedit
var
  MD5Password: string; // Hash
begin
  MD5Password := MD5DigestToStr(MD5String(aPassword));
  aPassword := '';
// Pseudocode:
// Query... frage die Datenbank ob es einen Benutzer(aUserName) mit dem MD5Passwort gibt.
// !!! Werte immer als Parameter der Query mitgeben.
// Hat die Query eine Antwort (Resultmenge = 1) ist der Benutzer gültig
// fertsch...
// Mach was mit dem User
end;
Beim Speichern des neuen Paßwortes erzeugst du auch den MD5, setzt die Paßwortvariable auf '' und speicherst den MD5 ab. Mit obiger Methode hast du im Programm keinen Vergleich der Paßwörter. Dieser läuft quasi schon in der Datenbank. Wenn du im Programm vergleichen willst dann nur die Hashes.

PS: Das ist eine einfache Variante aber ausreichend. Sicherer geht es immer... :wink:

Das sieht erstmal interessant aus, auch wenn ich es noch nicht so ganz verstanden habe aber ich werde mich morgen Abend mal daran setzten und versuchen den Code und die .pas Datei einzubinden und hoffentlich klappt es dann auch...

Aber eine Frage noch vorweg, muss das LoginFenster in der der Unit DelphiMD5 eingebaut werden oder wird die "procedure TLogin.Login..." in meiner eigentlichen Login Unit (in meinem Fall die Unit 1) mit dem Befehl "uses DelphiMD5;" automatisch abgearbeitet?

MfG und einen schönen rest Samstag

René

PS: Bitte denkt daran, ich bin erst seit ca. einer Woche mit dem Programmieren am Gange und zuvor hatte ich keinerlei Erfahrungen bzw. Kenntnisse im Bereich der Programmierung. Das einzige was ich bisher gemacht habe, ist die Homepage unseres Ortsvereins...

haentschman 19. Mär 2016 18:32

AW: Passwortabfrage mit Datenbank abgleichen
 
Wenn von deiner Seite die entsprechende Initiative zurückkommt helfen wir gern...:thumb:
Zitat:

PS: Bitte denkt daran, ich bin erst seit ca. einer Woche mit dem Programmieren am Gange und zuvor hatte ich keinerlei Erfahrungen bzw. Kenntnisse im Bereich der Programmierung. Das einzige was ich bisher gemacht habe, ist die Homepage unseres Ortsvereins...
...das sind natürlich andere Voraussetzungen. Morgen früh drösel ich dir das etwas verständlicher auf. Unabhängig davon solltest du aber, bevor du richtig programmieren willst, den Delphi Crashkurs durcharbeiten.
http://www.delphi-treff.de/tutorials...phi-crashkurs/

Thieon 19. Mär 2016 18:42

AW: Passwortabfrage mit Datenbank abgleichen
 
Zitat:

Zitat von haentschman (Beitrag 1333372)
...das sind natürlich andere Voraussetzungen. Morgen früh drösel ich dir das etwas verständlicher auf. Unabhängig davon solltest du aber, bevor du richtig programmieren willst, den Delphi Crashkurs durcharbeiten.
http://www.delphi-treff.de/tutorials...phi-crashkurs/

Danke für den Hinweis, ich werde mir das auch mal durchlesen... Ich habe untrer anderem auch das Buch BorlandDelphi 7 und gehe das Schritt für Schritt durch und ich hoffe mal, dass ich in der Uni auch entsprechend aufgeschlaut werde auch wenn es sich bei mir lediglich um eine Vertiefung im Bereich der Wirtschaftsinformatik handelt. Aber eins hat es gebracht, ich traue mich zumindest schon mal an das Thema ran, wo ich sonst immer dachte, das ich für das Programmieren zu blöd bin :-D.

MfG


René

haentschman 19. Mär 2016 18:52

AW: Passwortabfrage mit Datenbank abgleichen
 
Das Buch ist auch in Ordnung. Du solltest ein Verständnis für diverse Begrifflichkeiten und deren Verwendung haben. (Variablen, Konstanten, Prozeduren, Funktionen, Klasse, Instanz etc.)
Der Rest ist Übungssache und viel probieren. :thumb:

haentschman 20. Mär 2016 08:05

AW: Passwortabfrage mit Datenbank abgleichen
 
Moin... :P

Dann schaun wir mal...
Zitat:

muss das LoginFenster in der der Unit DelphiMD5 eingebaut werden oder wird die "procedure TLogin.Login..." in meiner eigentlichen Login Unit (in meinem Fall die Unit 1) mit dem Befehl "uses DelphiMD5;" automatisch abgearbeitet?
Eine Unit ist eine "Sammlung" von Klassen, Funktionen, Procedure etc. welche, normalerweise, funktional zusammenhängen. An dieser Unit wird nichts verändert...sie wird einfach benutzt. Dazu wird sie im uses Abschnitt eingebunden. Dem Delphi spendierst du noch den Suchpfad in dem die PAS liegt.
Mit dem entsprechenden Vorwissen hättest du an meinem Beispielcode gesehen das mein Login eine Klasse ist. Für den Anfang geht das natürlich auch ohne. Du spendierst deinem Form eine private procedure namens Login oder ähnlich :wink:. In dieser Procedure bringst du dann die Logik, entsprechend dem Beispiel, unter.
Hinweis: Wenn du mit Query statt Table arbeitest mußt du dich auch zwangsläufig mit SQL und Parametern beschäftigen. Das kann je nach verwendeten Komponenten eingeschränkt sein.

Wie du siehst ist das nicht mal eben programmiert wenn das Basiswissen fehlt. Programmieren ist ein ständiger Lernprozess bei dem man klein anfangen und sich ständig weiterentwickeln muß. Um die Motivation nicht zu verlieren braucht man auch Erfolgserlebnisse. Die kannst du aber knicken wenn du deine Ziele zu hoch ansetzt. Dann lieber Step by Step... :thumb:

Hänge mal deinen kompletten Code hier an. Da sehen wir mal wo es Nachholebedarf gibt. :zwinker:

Thieon 21. Mär 2016 09:13

AW: Passwortabfrage mit Datenbank abgleichen
 
Erstmal Danke... Ich habe versuch deinen Code einzubinden, aber dann kommen lauter Fehlermeldungen:

Projekt kompilieren, Ziel: DRK: Exit code 256, Fehler: 1
DelphiMD5.pas(17,6) Fatal: Kann Windows nicht finden verwendet von DelphiMD5 des Projektinspektors.

Projekt kompilieren, Ziel: DRK: Exit code 256, Fehler: 20, Hinweise: 5
DelphiMD5.pas(234,30) Error: Operator is not overloaded: "TUINT4Array" and "Byte"
DelphiMD5.pas(235,33) Error: Operator is not overloaded: "TUINT4Array" shr "ShortInt"
DelphiMD5.pas(236,33) Error: Operator is not overloaded: "TUINT4Array" shr "ShortInt"
DelphiMD5.pas(237,33) Error: Operator is not overloaded: "TUINT4Array" shr "ShortInt"
DelphiMD5.pas(258,16) Error: Illegal type conversion: "TByteArray" to "LongWord"
DelphiMD5.pas(258,36) Error: Illegal type conversion: "TByteArray" to "LongWord"
DelphiMD5.pas(259,5) Error: Illegal type conversion: "TByteArray" to "LongWord"
DelphiMD5.pas(259,36) Error: Illegal type conversion: "TByteArray" to "LongWord"
DelphiMD5.pas(288,10) Error: Incompatible types: got "TArray4UINT4" expected "LongWord"
DelphiMD5.pas(288,23) Error: Incompatible types: got "TArray4UINT4" expected "LongWord"
DelphiMD5.pas(288,36) Error: Incompatible types: got "TArray4UINT4" expected "LongWord"
DelphiMD5.pas(288,49) Error: Incompatible types: got "TArray4UINT4" expected "LongWord"
DelphiMD5.pas(360,2) Error: Operator is not overloaded: inc "TArray4UINT4"
DelphiMD5.pas(360,2) Error: Incompatible types: got "untyped" expected "TArray4UINT4"
DelphiMD5.pas(361,2) Error: Operator is not overloaded: inc "TArray4UINT4"
DelphiMD5.pas(361,2) Error: Incompatible types: got "untyped" expected "TArray4UINT4"
DelphiMD5.pas(362,2) Error: Operator is not overloaded: inc "TArray4UINT4"
DelphiMD5.pas(362,2) Error: Incompatible types: got "untyped" expected "TArray4UINT4"
DelphiMD5.pas(363,2) Error: Operator is not overloaded: inc "TArray4UINT4"
DelphiMD5.pas(363,2) Error: Incompatible types: got "untyped" expected "TArray4UINT4"
DelphiMD5.pas(461,17) Hint: Local variable "Context" does not seem to be initialized
DelphiMD5.pas(468,33) Hint: Local variable "Buffer" does not seem to be initialized
DelphiMD5.pas(475,17) Hint: Function result variable does not seem to be initialized
DelphiMD5.pas(482,17) Hint: Local variable "Context" does not seem to be initialized
DelphiMD5.pas(484,17) Hint: Function result variable does not seem to be initialized


Ach ja ich hatte in einen Post zuvor erwähnt, dass ich Lazarus verwende und nicht Delphi, für den Fall, dass dies noch nicht bekannt sein sollte und dies den Fehler verursachen sollte. Zudem Schreibe ich das Programm primär unter Linux und anschließend kompiliere ich es noch unter Mac und Windows 10. ...:pale:

Zitat:

Zitat von haentschman (Beitrag 1333387)

Hänge mal deinen kompletten Code hier an. Da sehen wir mal wo es Nachholebedarf gibt. :zwinker:

Aber Du wolltest ja, dass ich mal meinen kompletten Code anhänge... Mein Du damit den Code aus meiner LogIn Unit oder das ganze Projekt? Ich füge erstmal nur den der LogIn Unit bei, fall das nicht reicht, dann bitte bescheid sagen....

Code:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, sqldb, db, FileUtil, Forms, Controls, Graphics, Dialogs,
  ComCtrls, ExtCtrls, StdCtrls, Buttons, Menus;

type

  { TForm1 }

  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    CheckBox1: TCheckBox;
    Image1: TImage;
    Benutzer: TLabeledEdit;
    Code: TLabeledEdit;
    MainMenu1: TMainMenu;
    MenuItem1: TMenuItem;
    MenuItem2: TMenuItem;
    StatusBar1: TStatusBar;
    Timer1: TTimer;
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure CheckBox1Change(Sender: TObject);
    procedure CodeChange(Sender: TObject);
    procedure CodeKeyPress(Sender: TObject; var Key: char);
    procedure MenuItem2Click(Sender: TObject);
    procedure MenuItem4Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);


  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation
 uses Unit2, Unit3, Unit4;
{$R *.lfm}

{ TForm1 }
//Anzeige DATUM und Uhrzeit in der Statusleiste
procedure TForm1.Timer1Timer(Sender: TObject);
var
  hr, min, sec, msec: Word;

begin
DecodeTime(now, hr, min, sec, msec);
StatusBar1.Panels[1].Text := FormatDateTime ('dd.mm.yyyy, hh:nn:ss', Now);
Form2.StatusBar2.Panels[1].Text := FormatDateTime ('dd.mm.yyyy, hh:nn:ss', Now);
Form3.StatusBar1.Panels[1].Text := FormatDateTime ('dd.mm.yyyy, hh:nn:ss', Now);
Form4.StatusBar1.Panels[1].Text := FormatDateTime ('dd.mm.yyyy, hh:nn:ss', Now);
end;
//Abbruch des Logins und schlie&#8730;üen des Programms
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  form2.close;
end;

// Passworteingabe durch Sternchen ersetzten
procedure TForm1.CodeChange(Sender: TObject);
begin
  Code.PasswordChar := '*';
end;
//Passworteingabe durch Sternchen deaktivieren
procedure TForm1.CheckBox1Change(Sender: TObject);
begin
   if CheckBox1.Checked then
      begin
      Code.PasswordChar := #0;
      end else
      begin
      Code.PasswordChar := '*';
      end
end;

//Mit Enter den LoginButton aktivieren
procedure TForm1.CodeKeyPress(Sender: TObject;
var Key: Char);
begin
  if Key = #13 then begin
    BitBtn1.Click; // or something else
    Key := #0;
  end;
end;

//LoginButton = true Weiterleitung zum MainForm und schlie&#8730;üen LoginFenster
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  form3.dbf1.Filtered := false;
  form3.dbf1.Filter := Format('Ben = %s and Code = %s',[QuotedStr(Benutzer.text),QuotedStr(Code.Text)]);
  form3.dbf1.Filtered := true;
  form3.dbf1.First;
  if not form3.dbf1.EoF then begin
    form2.show;
    form1.close;
  end;
  form3.dbf1.Filtered := false;
end;

//Beenden des Programms durch das Mainmenü
procedure TForm1.MenuItem2Click(Sender: TObject);
begin
  form2.close;
end;

procedure TForm1.MenuItem4Click(Sender: TObject);
begin
  form3.showmodal;
end;

end.

Nochmals vielen Dank für die umfangreiche Hilfe, das ist nicht selbstverständlich und vor allem wird es in vielen Foren immer seltener...

Gruß

René

himitsu 21. Mär 2016 10:38

AW: Passwortabfrage mit Datenbank abgleichen
 
Nur noch was Grundsätzliches zu "Passwörtern".
Zitat:

Delphi-Quellcode:
if
  (Benutzer.text = form3.Dbf1.FieldByName('Ben').AsString)
and
   (Code.Text = form3.Dbf1.FieldByName('Code').AsString)

Passwörter NIEMALS im Klartext speichern, sondern nur "verschlüsselt", bzw. besser gehasht mit Salt (nicht entschlüsselbar).

DeddyH 21. Mär 2016 10:47

AW: Passwortabfrage mit Datenbank abgleichen
 
Seit #11 geht es ja genau darum :roll:

himitsu 21. Mär 2016 11:11

AW: Passwortabfrage mit Datenbank abgleichen
 
Hatte mir noch nicht alles durchgelesen ... mit einigen Strg+F fand ich auf die schnelle nichts, was sich darum handelte. :oops:

Gelesen hatte ich bis dahin, dass es vielleicht besser sei sich bei der DB anzumelden und es nicht selber zu bauen, oder so. :angle2:

Sir Rufo 21. Mär 2016 11:25

AW: Passwortabfrage mit Datenbank abgleichen
 
@himitsu

never mind - du hast auf jeden Fall einen sehr wichtigen Aspekt noch hinzugefügt: Salted Hash

haentschman 21. Mär 2016 13:38

AW: Passwortabfrage mit Datenbank abgleichen
 
:wink: Jungs... ich hatte ja geschrieben... "Sicherer geht es immer". Wir reden hier maximal über eine Vereinsverwaltung eines Programmieranfängers und nicht die NASA... :P Er ist schon verwirrt genug. :zwinker:

Thieon 21. Mär 2016 18:43

AW: Passwortabfrage mit Datenbank abgleichen
 
Zitat:

Zitat von haentschman (Beitrag 1333457)
Er ist schon verwirrt genug. :zwinker:

Das kannst Du wohl laut sagen... :oops:

haentschman 22. Mär 2016 05:58

AW: Passwortabfrage mit Datenbank abgleichen
 
Moin... :P

...mit Lazarus kann ich dir nicht weiterhelfen. :? Das Prinzip dürfte soweit klar sein. Gehe auf die Suche nach einer MD5 Bibliothek für Lazarus. Dann probierst du es damit. :thumb:

PS: Die MD5 Unit kompliliert unter Delphi ohne Warnungen. Daran sieht man das es nicht paßt. :?

mkinzler 22. Mär 2016 08:23

AW: Passwortabfrage mit Datenbank abgleichen
 
Wenn er schon sucht, sollte er aber nach einer mit einem besseren Hashverfahren (SHA-256 oder Spezial Hash-Funktionen für Passwörter) suchen. Microsoft sperrt jetzt schon Zertifikate mit SHA1 (dem "Nachfolger" von MD5).

https://de.wikipedia.org/wiki/Hashfunktion

https://github.com/TurboPack/LockBox3

Thieon 22. Mär 2016 18:10

AW: Passwortabfrage mit Datenbank abgleichen
 
Ich danke euch... Ich werde mir das morgen mal in aller Ruhe anschauen und hoffentlich werde ich dann ein bisschen schlauer. :-D

MfG

René

haentschman 22. Mär 2016 18:56

AW: Passwortabfrage mit Datenbank abgleichen
 
:thumb:...jeden Tag ein wenig mehr.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:32 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-2025 by Thomas Breitkreuz