Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   FreePascal Fehler beim Passwortstärkeberechnung (https://www.delphipraxis.net/183097-fehler-beim-passwortstaerkeberechnung.html)

AlexII 11. Dez 2014 09:45

Delphi-Version: 7

Fehler beim Passwortstärkeberechnung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich lasse wie folgt die Passwortstärke berechnen.

Delphi-Quellcode:
procedure TForm1.PassStrength();
var
  a, b, c, d, e, f, summezeichen, potenz, jahre: Float;
begin
  if UppercaseCB.Checked then a := 26 else a := 0;
  if LowercaseCB.Checked then b := 26 else b := 0;
  if DigitsCB.Checked then c := 10 else c := 0;
  if ArithmoperatorsCB.Checked then d := 5 else d := 0;
  if BracketCB.Checked then e := 8 else e := 0;
  if SpecialcharsCB.Checked then f := 19 else f := 0;

  summezeichen := (a + b + c + d + e + f);
  potenz := Power(summezeichen, vPasslength);
  jahre := ((potenz / 2096204400) / 31536000) / 1000;

  PassStrengthLabel.Left := (Shape1.Width - PassStrengthLabel.Width) div 2;

  if Round(jahre) <= 10 then
  begin
    Shape1.Brush.Color := clRed;
    PassStrengthLabel.Caption := FloatToStr(Round(jahre)) + ' ' + 'Schwach';
  end else if (Round(jahre) >= 11) and (Round(jahre) <= 70) then
  begin
    Shape1.Brush.Color := clYellow;
    PassStrengthLabel.Caption := FloatToStr(Round(jahre)) + ' ' + 'Gut';
  end else
  begin
    Shape1.Brush.Color := clGreen;
    PassStrengthLabel.Caption := FloatToStr(Round(jahre)) + ' ' + 'Sehr gut';
  end;
end;

Das funktioniert soweit gut, aber ab und zu bekomme ich diese Fehlermeldung, siehe Screenshot. Ich verstehe schon, dass es irgendwie mit zu großen Zahlen zu tun hat... aber wie ich das löse weiß ich jetzt nicht. Bin für jede Hilfe dankbar. ))

Sherlock 11. Dez 2014 09:52

AW: Fehler beim Passwortstärkeberechnung
 
Das sieht mir viel zu sehr nach Voodoo aus.
Sogenannte starke Passwörter führen nur zu Post-Its am Bildschirm, weil man sich die Biester nicht merken kann. Vor allem, wenn man noch verlangt die bitte schön alle zwei Wochen zu ändern.

Zur Lösung des Problems: Nimm kleinere Zahlen bei der Berechnung des Wertes von
Delphi-Quellcode:
jahre
- cooler, irreführender Bezeichner btw.

Sherlock

AlexII 11. Dez 2014 09:54

AW: Fehler beim Passwortstärkeberechnung
 
Zitat:

Zitat von Sherlock (Beitrag 1283019)
Das sieht mir viel zu sehr nach Voodoo aus.
Sogenannte starke Passwörter führen nur zu Post-Its am Bildschirm, weil man sich die Biester nicht merken kann. Vor allem, wenn man noch verlangt die bitte schön alle zwei Wochen zu ändern.

Zur Lösung des Problems: Nimm kleinere Zahlen bei der Berechnung des Wertes von
Delphi-Quellcode:
jahre
- cooler, irreführender Bezeichner btw.

Sherlock

Das ganze ist noch ein Prototyp, ich werde noch so einiges ändern und die Variablen bekommen englische Bezeichner.
Aber wie kann ich kleinere Werte nehmen? Dann stimmt doch die Berechnung nicht.

Headbucket 11. Dez 2014 09:54

AW: Fehler beim Passwortstärkeberechnung
 
Führe dein Programm doch mal im Debugger aus.

Dann siehst du genau, an welcher stelle es "knallt". Zur Not musst du es halt mehrmals versuchen, wenn der Fehler nur selten auftritt.

Mal angenommen keine deiner Checkboxen ist angewählt...in diesem Fall wird für "summezeichen" 0 berechnet (die Klammern kannst du hier weglassen).
Wenn nun die Passwortlänge auch 0 ist, so rechnest du in der nächste Zeile 0^0.

Hier wird wohl die Fehlermeldung herkommen.
Okay. Mathe ist wohl schon ein Weilchen her. Das wars nicht. Ab der Zeile hatte ich dann aufgehört zu lesen.
Delphi macht aus 0^0 = 1. So wie es auch bei Wikipedia steht. Da hat mich mein Taschenrechner im Stich gelassen.

Du solltest dir also etwas überlegen, um diesen Fall abzufangen.
Beispiel: Du prüfst am Anfang der Prozedure, ob die Passwortlänge > 0 ist. Ist das nicht der fall -> exit

Gruß
Headbucket

AlexII 11. Dez 2014 10:00

AW: Fehler beim Passwortstärkeberechnung
 
Zitat:

Zitat von Headbucket (Beitrag 1283021)
Führe dein Programm doch mal im Debugger aus.

Dann siehst du genau, an welcher stelle es "knallt". Zur Not musst du es halt mehrmals versuchen, wenn der Fehler nur selten auftritt.

Mal angenommen keine deiner Checkboxen ist angewählt...in diesem Fall wird für "summezeichen" 0 berechnet (die Klammern kannst du hier weglassen).
Wenn nun die Passwortlänge auch 0 ist, so rechnest du in der nächste Zeile 0^0.

Hier wird wohl die Fehlermeldung herkommen.
Okay. Mathe ist wohl schon ein Weilchen her. Das wars nicht. Ab der Zeile hatte ich dann aufgehört zu lesen.

Du solltest dir also etwas überlegen, um diesen Fall abzufangen.
Beispiel: Du prüfst am Anfang der Prozedure, ob die Passwortlänge > 0 ist. Ist das nicht der fall -> exit

Gruß
Headbucket

Ja die Passwortlänge 0 und > 33 werde ich abfangen (ich meine Passwortlänge > 33 berechne ich nicht, weil das in jedem Fall sehr gut ist). Aber der Fehler liegt irgendwo dazwischen.

cookie22 11. Dez 2014 10:41

AW: Fehler beim Passwortstärkeberechnung
 
Ob ein Passwort gut ist oder nicht, kannst du aber nicht wirklich berechnen. Da musst du schon die Entopie mit einbeziehen.

Sherlock 11. Dez 2014 10:43

AW: Fehler beim Passwortstärkeberechnung
 
Hast Du eine Quelle für den Algorithmus, oder ist das selbst ausgedacht? Eventuell könnte man da ansetzen.

Sherlock

AlexII 11. Dez 2014 10:58

AW: Fehler beim Passwortstärkeberechnung
 
Zitat:

Zitat von cookie22 (Beitrag 1283031)
Ob ein Passwort gut ist oder nicht, kannst du aber nicht wirklich berechnen. Da musst du schon die Entopie mit einbeziehen.

Ich verstehe was Du meinst, aber in meinem Fall kann ich das, da ich ganz genau weiß mit welchen Zeichen ich das Passwort erstelle und wie lange das Passwort ist. Meine Anwendung generiert sie. Hätte der User das Passwort selber eingegeben, dann hast Du recht, hier greift meine Methode nicht.

AlexII 11. Dez 2014 11:08

AW: Fehler beim Passwortstärkeberechnung
 
Zitat:

Zitat von Sherlock (Beitrag 1283032)
Hast Du eine Quelle für den Algorithmus, oder ist das selbst ausgedacht? Eventuell könnte man da ansetzen.

Sherlock



Ich habe das selber ausgedacht.

(((Anzahl Zeichen^Passwortlänge)/Schlüssel in der Sekunde, dass ein moderner Rechner schafft)/Sekunden im Jahr)/1000

Ich teile das ganze durch 1000 um die Entwicklung der Prozessoren einzuberechnen.

Dejan Vu 11. Dez 2014 11:19

AW: Fehler beim Passwortstärkeberechnung
 
Die Formel berechnet also die Anzahl der möglichen Kennwörter, die sich mit den Checkbox-Einstellungen generieren lassen. Aus dieser Anzahl wird unter der Annahme, das soundsoviele Kennwörter pro Sekunde mit brute force probiert werden, die Anzahl der Jahre ausgerechnet, die ein BF-Algorithmus benötigt, um alle Kombinationen durchzurechnen. Soweit richtig geraten?

Na ja. Nicht blöd und kein Voodoo (außer die Geschwindigkeit des BF, da würde ich noch die Quelle angeben).
Zitat:

Zitat von Sherlock (Beitrag 1283019)
...
Delphi-Quellcode:
jahre
- cooler, irreführender Bezeichner

Wenn ich die Idee richtig verstanden habe, ist das weder irreführend noch cool, weil richtig.
Zitat:

Zitat von AlexII (Beitrag 1283020)
...die Variablen bekommen englische Bezeichner.

Was hast Du gegen deutsche Bezeichner? Lieber einen verständlichen deutschen Bezeichner als ein mit google.translate übersetzten, über den sich die Engländer krank lachen. aber deine 'a,b,c,d,e' etc. solltest Du mit besser benennen.
Delphi-Quellcode:
var
  AnzahlUnterschiedlicherZeichen : integer;

begin
  AnzahlUnterschiedlicherZeichen := 0;
  if UppercaseCB.Checked then inc (AnzahlUnterschiedlicherZeichen , 26);
  if LowercaseCB.Checked then inc (AnzahlUnterschiedlicherZeichen , 26);
  if DigitsCB.Checked then inc (AnzahlUnterschiedlicherZeichen , 10);
  if ArithmoperatorsCB.Checked then inc(AnzahlUnterschiedlicherZeichen ,5);
  if BracketCB.Checked then inc (AnzahlUnterschiedlicherZeichen , 8);
  if SpecialcharsCB.Checked then inc (AnzahlUnterschiedlicherZeichen , 19);


...
Dann versteht man gleich, worum es geht. Oder?

Zum Problem:
Anstatt 'Power' zu nehmen, machst Du das mit einer Schleife und teilst 1x in der Schleife, falls das Zwischenergebnis zu groß wird. Wenn die Schleife durch ist, prüfst Du, ob Du schon geteilt hast. Wenn nicht (weil das Zwischenergebnis doch nicht zu hoch war), teilst Du dann.

Hehe: Roter Kasten: Richtig geraten :mrgreen:

AlexII 11. Dez 2014 11:34

AW: Fehler beim Passwortstärkeberechnung
 
Zitat:

Zitat von Dejan Vu (Beitrag 1283040)
Die Formel berechnet also die Anzahl der möglichen Kennwörter, die sich mit den Checkbox-Einstellungen generieren lassen. Aus dieser Anzahl wird unter der Annahme, das soundsoviele Kennwörter pro Sekunde mit brute force probiert werden, die Anzahl der Jahre ausgerechnet, die ein BF-Algorithmus benötigt, um alle Kombinationen durchzurechnen. Soweit richtig geraten?

Korrekt :thumb:


Zitat:

Zitat von Dejan Vu (Beitrag 1283040)
Na ja. Nicht blöd und kein Voodoo (außer die Geschwindigkeit des BF, da würde ich noch die Quelle angeben).

hier


Zitat:

Zitat von Dejan Vu (Beitrag 1283040)
Zitat:

Zitat von Sherlock (Beitrag 1283019)
...
Delphi-Quellcode:
jahre
- cooler, irreführender Bezeichner

Wenn ich die Idee richtig verstanden habe, ist das weder irreführend noch cool, weil richtig.
Zitat:

Zitat von AlexII (Beitrag 1283020)
...die Variablen bekommen englische Bezeichner.

Was hast Du gegen deutsche Bezeichner? Lieber einen verständlichen deutschen Bezeichner als ein mit google.translate übersetzten, über den sich die Engländer krank lachen. aber deine 'a,b,c,d,e' etc. solltest Du mit besser benennen.


Ich sorge schon mal vor, falls jemand aus Silicon Valley mein Prog abkauft und ich in das Hauptbüro in USA ziehen muss, müssen die Variablennamen nicht geändert werden. Und für die Engländer ist lachen gesund. :mrgreen:



Zitat:

Zitat von Dejan Vu (Beitrag 1283040)
Delphi-Quellcode:
var
  AnzahlUnterschiedlicherZeichen : integer;

begin
  AnzahlUnterschiedlicherZeichen := 0;
  if UppercaseCB.Checked then inc (AnzahlUnterschiedlicherZeichen , 26);
  if LowercaseCB.Checked then inc (AnzahlUnterschiedlicherZeichen , 26);
  if DigitsCB.Checked then inc (AnzahlUnterschiedlicherZeichen , 10);
  if ArithmoperatorsCB.Checked then inc(AnzahlUnterschiedlicherZeichen ,5);
  if BracketCB.Checked then inc (AnzahlUnterschiedlicherZeichen , 8);
  if SpecialcharsCB.Checked then inc (AnzahlUnterschiedlicherZeichen , 19);


...
Dann versteht man gleich, worum es geht. Oder?

Habe diese Schreibweise noch nie gesehen.

Zitat:

Zitat von Dejan Vu (Beitrag 1283040)
Zum Problem:
Anstatt 'Power' zu nehmen, machst Du das mit einer Schleife und teilst 1x in der Schleife, falls das Zwischenergebnis zu groß wird. Wenn die Schleife durch ist, prüfst Du, ob Du schon geteilt hast. Wenn nicht (weil das Zwischenergebnis doch nicht zu hoch war), teilst Du dann.

Hm... kapiere es nocht nicht, aber denke in Ruhe noch Mal nach. Danke!

AlexII 11. Dez 2014 12:17

AW: Fehler beim Passwortstärkeberechnung
 
Ich habe rausgefunden, dass der Fehler hier liegt, die Frage ist nur wieso hat Lazarus damit Probleme?

Delphi-Quellcode:
Trunc(jahre)
oder
Round(jahre)

Sherlock 11. Dez 2014 12:32

AW: Fehler beim Passwortstärkeberechnung
 
Dann sind halt die MagicNumbers irreführend. Ich für meinen Teil würde nicht beim Lesen von Code rechnen wollen, was denn mit den immerhin aus menschlicher sicht großen Zahlen gemeint ist.

Grundsätzlich gibt es aber heutzutage eher Wörterbuch-Attacken, als pure Brute-Force Zeichenverkettung-Versuche. Darauf geht Dein Algorithmus gar nicht ein. Da solltes du noch dran schrauben.

Sherlock

himitsu 11. Dez 2014 12:46

AW: Fehler beim Passwortstärkeberechnung
 
Zitat:

Zitat von Sherlock (Beitrag 1283053)
Darauf geht Dein Algorithmus gar nicht ein.

Der Code geht überhaupt nicht auf irgendwas ein.

Das Wichtigste wird ja total ignoriert.
Passwortlänge, Anzahl der Zeichen, Welche Zeichen, in welcher Reihenfolge, ...

A
Z
AZ
AAAAA
AAAAAAAAAAAAAAA
AAAAAAAABAAAAAA
ISTHIERALLESDASSELBE
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBAABBA

ist hier alles das Selbe

Hier mal ein paar Passwörter, mit welchen man die letzten 3 Tage versuchte meine Webseite zu hacken.
iloveyou / {meinedomain}321 / winner / {meinöffentlicherbenutzername}321
Daß man mit Bruteforce nicht schnell genug etwas erreicht, wissen selbst die dümmsten "Hacker". :stupid:
Nur so doof, wie deren Versuche war selbst ich nicht, auch wenn meine Passwörter bei diversen "Passwortstärkeberechnungen" nicht gut abschneiden.
(bei einem meiner Passwörter meint dein Code Jahre=0.00000043 ... aber wer macht schon Bruteforce, vorallem wenn man nur maximal 120 Versuche am Tag hat ... da stimmen deine "Jahre" nun doch nicht :tongue:)

AlexII 11. Dez 2014 13:04

AW: Fehler beim Passwortstärkeberechnung
 
Zitat:

Zitat von Sherlock (Beitrag 1283053)
Grundsätzlich gibt es aber heutzutage eher Wörterbuch-Attacken, als pure Brute-Force Zeichenverkettung-Versuche. Darauf geht Dein Algorithmus gar nicht ein. Da solltes du noch dran schrauben.

Sherlock

Das stimmt, aber mein Programm gibt die Passwörter vor, nicht der User. Daher gibt's da keine Wörter, Geb.Datum und desgleichen.

Sherlock 11. Dez 2014 13:06

AW: Fehler beim Passwortstärkeberechnung
 
Also soll Dein Programm ein zufälliges Passwort erstellen, und sich dann quasi selbst prüfen? Achsooooo.
Wehe dem, der sich das merken muss. ;)

Sherlock

AlexII 11. Dez 2014 13:08

AW: Fehler beim Passwortstärkeberechnung
 
Zitat:

Zitat von himitsu (Beitrag 1283054)

Das Wichtigste wird ja total ignoriert.
Passwortlänge, Anzahl der Zeichen, Welche Zeichen, in welcher Reihenfolge, ...

Alles falsch, mein Programm geht auf alles ein. Ihr habt nur die Logik von dem Prog nicht verstanden. Da wird nicht ausgewertet was der User eingegeben hat. Das Prog generiert die Passwörter selber. Da ist nix mit Wörterbuch usw.

Dejan Vu 11. Dez 2014 13:09

AW: Fehler beim Passwortstärkeberechnung
 
Die Frage war: Wieso kommt ein Überlauffehler?

Zitat:

Zitat von AlexII (Beitrag 1283051)
Ich habe rausgefunden, dass der Fehler hier liegt, die Frage ist nur wieso hat Lazarus damit Probleme?

Delphi-Quellcode:
Trunc(jahre)
oder
Round(jahre)

Ich glaube, 'Trunc' liefert einen Integer-Wert und der ist bezüglich der Größe beschränkt. 'Round' nicht. Oder umgekehrt, oder beide... Wie groß ist 'Jahre' denn?

AlexII 11. Dez 2014 13:10

AW: Fehler beim Passwortstärkeberechnung
 
Zitat:

Zitat von Sherlock (Beitrag 1283058)
Also soll Dein Programm ein zufälliges Passwort erstellen, und sich dann quasi selbst prüfen? Achsooooo.
Wehe dem, der sich das merken muss. ;)

Sherlock

Muss man auch nicht... das wird abgespeichert.

Dejan Vu 11. Dez 2014 13:18

AW: Fehler beim Passwortstärkeberechnung
 
Wieso bietest Du dann die Möglichkeit der unterschiedlichen Zeichenvorräte (Groß/Kleinschreibung, Zifferm, Sonderzeichen etc.)?


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