Delphi-PRAXiS
Seite 1 von 2  1 2      

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:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:16 Uhr.
Seite 1 von 2  1 2      

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