|
![]() |
|
Registriert seit: 24. Feb 2007 Ort: Baden 1.566 Beiträge Delphi 2007 Professional |
#1
(Sorry für Doppelpost, aber mit dem Code im Post oben, wäre das arg unübersichtlich geworden)
Was mich auf die Idee bringt, ein mögliches Passwort zu googlen und den Kehrwert der Treffer zu verwenden.
Die Idee mit Google ist übrigens richtig gut, denke da werden auch verschiedene Sprachen gut abgedeckt. €: Wäre es ein Passwort-Generator, wäre das eine gute Methode, um das zufällig erzeugte Passwort nochmal zu checken. Geändert von Satty67 (27. Sep 2010 um 19:12 Uhr) |
![]() |
Registriert seit: 4. Dez 2003 Ort: Cottbus 2.094 Beiträge |
#2
Die Idee mit Google ist übrigens richtig gut, denke da werden auch verschiedene Sprachen gut abgedeckt. €: Wäre es ein Passwort-Generator, wäre das eine gute Methode, um das zufällig erzeugte Passwort nochmal zu checken.
![]()
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
|
![]() |
Registriert seit: 24. Feb 2007 Ort: Baden 1.566 Beiträge Delphi 2007 Professional |
#3
Nein, Google lädt man sich vorher runter auf einen USB-Stick oder so... naja, wie gesagt, irgend etwas übersicht man immer
![]() Wer sich den Spass machen will, in der Anlage eine Exe, die schlicht die beiden Funktionen gegenüber stellt. Es ist wohl mit etwas Suche immer möglich, für beide Funktionen einen Satz Passwörter zu finden, wo diese blöd aussehen. Geändert von Satty67 (27. Sep 2010 um 19:42 Uhr) |
![]() |
Registriert seit: 5. Jan 2005 Ort: Stadthagen 9.454 Beiträge Delphi 10 Seattle Enterprise |
#4
Diesen Password-Prüfer
![]()
Kaum macht man's richtig - schon funktioniert's
![]() Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60) |
![]() |
Registriert seit: 24. Feb 2007 Ort: Baden 1.566 Beiträge Delphi 2007 Professional |
#5
hab' gleich mal Satty67 und Sattttttty67 eingegeben (duck und weg...)
Ne, also sehr interessant. Man kann auch schön verfolgen, wie einzelne Eingaben bewertet werden. Allgemein geht es aber fast zu schnell Richtung 100%. Da bleibt wenig Luft für Leute, die komplexere Passwörter mögen. Aber das kann man sicher anpassen. |
![]() |
Registriert seit: 5. Jan 2005 Ort: Stadthagen 9.454 Beiträge Delphi 10 Seattle Enterprise |
#6
Ich habe das mal übersetzt
Delphi-Quellcode:
unit uPassStrength;
interface type TPassphraseStrength = ( psVeryWeak, psWeak, psGood, psStrong, psVeryStrong ); TPassphraseInfo = record Length : integer; AlphaUC : integer; AlphaLC : integer; Number : integer; Symbol : integer; MidChar : integer; Requirements : integer; AlphasOnly : integer; NumbersOnly : integer; UnqChar : integer; RepChar : integer; RepInc : Extended; ConsecAlphaUC : integer; ConsecAlphaLC : integer; ConsecNumber : integer; ConsecSymbol : integer; ConsecCharType : integer; SeqAlpha : integer; SeqNumber : integer; SeqSymbol : integer; SeqChar : integer; ReqChar : integer; MultConsecCharType : integer; function Score : integer; function ScoreStr : string; function Strength : TPassphraseStrength; procedure Clear; end; procedure PassphraseAnalyseEx( const Password : string; out PassphraseInfo : TPassphraseInfo ); function PassphraseScore( const Password : string ) : integer; function PassphraseStrength( const Password : string ) : TPassphraseStrength; implementation uses SysUtils, Math; function StringReverse( const Str : string ) : string; var idx : integer; begin Result := ''; for idx := 1 to Length( Str ) do Result := Str[ idx ] + Result; end; procedure PassphraseAnalyseEx( const Password : string; out PassphraseInfo : TPassphraseInfo ); const AlphasUC = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; AlphasLC = 'abcdefghijklmnopqrstuvwxyz'; Alphas = 'abcdefghijklmnopqrstuvwxyz'; Numerics = '0123456789'; Symbols = ')!@#$%^&*()'; MinLength = 8; MinAlphaUC = 1; MinAlphaLC = 1; MinNumber = 1; MinSymbol = 1; var a : integer; TmpAlphaUC, TmpAlphaLC, TmpNumber, TmpSymbol : integer; b : integer; CharExists : Boolean; S : integer; Fwd, Rev : string; pwd : string; begin // Initialisierung TmpAlphaUC := 0; TmpAlphaLC := 0; TmpNumber := 0; TmpSymbol := 0; pwd := StringReplace( Password, ' ', '', [ rfReplaceAll ] ); PassphraseInfo.Clear; PassphraseInfo.Length := Length( pwd ); // Durchsuche das Passwort nach Symbolen, Nummern, Groß- und Kleinschreibung for a := 1 to Length( pwd ) do begin // Großbuchstaben if Pos( pwd[ a ], AlphasUC ) >= 1 then begin if ( TmpAlphaUC > 0 ) then begin if ( TmpAlphaUC + 1 = a ) then begin inc( PassphraseInfo.ConsecAlphaUC ); inc( PassphraseInfo.ConsecCharType ); end; end; TmpAlphaUC := a; inc( PassphraseInfo.AlphaUC ); end // Kleinbuchstaben else if Pos( pwd[ a ], AlphasLC ) >= 1 then begin if ( TmpAlphaLC > 0 ) then begin if ( TmpAlphaLC + 1 = a ) then begin inc( PassphraseInfo.ConsecAlphaLC ); inc( PassphraseInfo.ConsecCharType ); end; end; TmpAlphaLC := a; inc( PassphraseInfo.AlphaLC ); end // Ziffern else if Pos( pwd[ a ], Numerics ) >= 1 then begin if ( a > 1 ) and ( a < Length( pwd ) ) then inc( PassphraseInfo.MidChar ); if ( TmpNumber > 0 ) then begin if ( TmpNumber + 1 = a ) then begin inc( PassphraseInfo.ConsecNumber ); inc( PassphraseInfo.ConsecCharType ); end; end; TmpNumber := a; inc( PassphraseInfo.Number ); end // Symbole else if Pos( pwd[ a ], AlphasLC + AlphasUC + Numerics ) < 1 then begin if ( a > 1 ) and ( a < Length( pwd ) ) then inc( PassphraseInfo.MidChar ); if ( TmpSymbol > 0 ) then begin if ( TmpSymbol + 1 = a ) then begin inc( PassphraseInfo.ConsecSymbol ); inc( PassphraseInfo.ConsecCharType ); end; end; TmpSymbol := a; inc( PassphraseInfo.Symbol ); end; // Doppelte Zeichen prüfen CharExists := False; for b := 1 to Length( pwd ) do if ( a <> b ) and ( pwd[ a ] = pwd[ b ] ) then begin CharExists := true; PassphraseInfo.RepInc := PassphraseInfo.RepInc + ( Length( pwd ) / Abs( b - a ) ); end; if CharExists then begin inc( PassphraseInfo.RepChar ); PassphraseInfo.UnqChar := Length( pwd ) - PassphraseInfo.RepChar; if PassphraseInfo.UnqChar <> 0 then PassphraseInfo.RepInc := Ceil( PassphraseInfo.RepInc / PassphraseInfo.UnqChar ) else PassphraseInfo.RepInc := Ceil( PassphraseInfo.RepInc ); end; end; // for a := 1 to Length( pwd ) do for S := 1 to Length( Alphas ) - 2 do begin Fwd := Copy( Alphas, S, 3 ); Rev := StringReverse( Fwd ); if ( Pos( Fwd, LowerCase( pwd ) ) >= 1 ) or ( Pos( Rev, LowerCase( pwd ) ) >= 1 ) then begin inc( PassphraseInfo.SeqAlpha ); inc( PassphraseInfo.SeqChar ); end; end; for S := 1 to Length( Numerics ) - 2 do begin Fwd := Copy( Numerics, S, 3 ); Rev := StringReverse( Fwd ); if ( Pos( Fwd, LowerCase( pwd ) ) >= 1 ) or ( Pos( Rev, LowerCase( pwd ) ) >= 1 ) then begin inc( PassphraseInfo.SeqNumber ); inc( PassphraseInfo.SeqChar ); end; end; for S := 1 to Length( Symbols ) - 2 do begin Fwd := Copy( Symbols, S, 3 ); Rev := StringReverse( Fwd ); if ( Pos( Fwd, LowerCase( pwd ) ) >= 1 ) or ( Pos( Rev, LowerCase( pwd ) ) >= 1 ) then begin inc( PassphraseInfo.SeqSymbol ); inc( PassphraseInfo.SeqChar ); end; end; if ( PassphraseInfo.AlphaLC + PassphraseInfo.AlphaUC > 0 ) and ( PassphraseInfo.Symbol = 0 ) and ( PassphraseInfo.Number = 0 ) then PassphraseInfo.AlphasOnly := Length( pwd ); if ( PassphraseInfo.AlphaLC + PassphraseInfo.AlphaUC = 0 ) and ( PassphraseInfo.Symbol = 0 ) and ( PassphraseInfo.Number > 0 ) then PassphraseInfo.NumbersOnly := Length( pwd ); if ( PassphraseInfo.Length > 0 ) and ( PassphraseInfo.Length >= MinLength ) then inc( PassphraseInfo.ReqChar ); if ( PassphraseInfo.AlphaUC > 0 ) and ( PassphraseInfo.AlphaUC >= MinAlphaUC ) then inc( PassphraseInfo.ReqChar ); if ( PassphraseInfo.AlphaLC > 0 ) and ( PassphraseInfo.AlphaLC >= MinAlphaLC ) then inc( PassphraseInfo.ReqChar ); if ( PassphraseInfo.Number > 0 ) and ( PassphraseInfo.Number >= MinNumber ) then inc( PassphraseInfo.ReqChar ); if ( PassphraseInfo.Symbol > 0 ) and ( PassphraseInfo.Symbol >= MinSymbol ) then inc( PassphraseInfo.ReqChar ); PassphraseInfo.Requirements := PassphraseInfo.ReqChar; end; function PassphraseScore( const Password : string ) : integer; var pi : TPassphraseInfo; begin PassphraseAnalyseEx( Password, pi ); Result := pi.Score; end; function PassphraseStrength( const Password : string ) : TPassphraseStrength; var pi : TPassphraseInfo; begin PassphraseAnalyseEx( Password, pi ); Result := pi.Strength; end; { TPassphraseInfo } procedure TPassphraseInfo.Clear; begin Length := 0; AlphaUC := 0; AlphaLC := 0; Number := 0; Symbol := 0; MidChar := 0; Requirements := 0; AlphasOnly := 0; NumbersOnly := 0; UnqChar := 0; RepChar := 0; RepInc := 0; ConsecAlphaUC := 0; ConsecAlphaLC := 0; ConsecNumber := 0; ConsecSymbol := 0; ConsecCharType := 0; SeqAlpha := 0; SeqNumber := 0; SeqSymbol := 0; SeqChar := 0; ReqChar := 0; MultConsecCharType := 0; end; function TPassphraseInfo.Score : integer; const MultLength = 4; MultRepChar = 1; MultMidChar = 2; MultRequirements = 2; MultConsecAlphaUC = 2; MultConsecAlphaLC = 2; MultConsecNumber = 2; MultConsecCharType = 0; MultConsecSymbol = 1; MultAlphaUC = 2; MultAlphaLC = 2; MultSeqAlpha = 3; MultSeqNumber = 3; MultSeqSymbol = 3; MultNumber = 4; MultSymbol = 6; begin Result := 0; // Additions Result := Result + Length * MultLength; if ( AlphaUC > 0 ) and ( AlphaUC < Length ) then Result := Result + ( Length - AlphaUC ) * MultAlphaUC; if ( AlphaLC > 0 ) and ( AlphaLC < Length ) then Result := Result + ( Length - AlphaLC ) * MultAlphaLC; if ( Number > 0 ) and ( Number < Length ) then Result := Result + Number * MultNumber; Result := Result + Symbol * MultSymbol; Result := Result + MidChar * MultMidChar; if Requirements > 3 then Result := Result + Requirements * MultRequirements; // Deducations Result := Result - AlphasOnly; Result := Result - NumbersOnly; Result := Result - Trunc( RepInc ); Result := Result - ConsecAlphaUC * MultConsecAlphaUC; Result := Result - ConsecAlphaLC * MultConsecAlphaLC; Result := Result - ConsecNumber * MultConsecNumber; Result := Result - SeqAlpha * MultSeqAlpha; Result := Result - SeqNumber * MultSeqNumber; Result := Result - SeqSymbol * MultSeqSymbol; if Result > 100 then Result := 100 else if Result < 0 then Result := 0; end; function TPassphraseInfo.ScoreStr : string; begin case Strength of psVeryWeak : Result := 'sehr schwach'; psWeak : Result := 'schwach'; psGood : Result := 'gut'; psStrong : Result := 'stark'; psVeryStrong : Result := 'sehr stark'; end; end; function TPassphraseInfo.Strength : TPassphraseStrength; var sc : integer; begin sc := Score; if sc >= 80 then Result := psVeryStrong else if sc >= 60 then Result := psStrong else if sc >= 40 then Result := psGood else if sc >= 20 then Result := psWeak else Result := psVeryWeak; end; end.
Kaum macht man's richtig - schon funktioniert's
![]() Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60) |
![]() |
Registriert seit: 24. Feb 2007 Ort: Baden 1.566 Beiträge Delphi 2007 Professional |
#7
Das ging ja fix
![]() Ich würde zwar noch etwas TPassphraseInfo.Score anpassen, damit mehr Luft nach oben ist, aber ansonsten sehr interessant. |
![]() |
Registriert seit: 16. Mai 2007 403 Beiträge |
#8
Ich habe das mal übersetzt
Delphi-Quellcode:
unit uPassStrength;
interface type TPassphraseStrength = ( psVeryWeak, psWeak, psGood, psStrong, psVeryStrong ); TPassphraseInfo = record Length : integer; AlphaUC : integer; AlphaLC : integer; Number : integer; Symbol : integer; MidChar : integer; Requirements : integer; AlphasOnly : integer; NumbersOnly : integer; UnqChar : integer; RepChar : integer; RepInc : Extended; ConsecAlphaUC : integer; ConsecAlphaLC : integer; ConsecNumber : integer; ConsecSymbol : integer; ConsecCharType : integer; SeqAlpha : integer; SeqNumber : integer; SeqSymbol : integer; SeqChar : integer; ReqChar : integer; MultConsecCharType : integer; function Score : integer; function ScoreStr : string; function Strength : TPassphraseStrength; procedure Clear; end; procedure PassphraseAnalyseEx( const Password : string; out PassphraseInfo : TPassphraseInfo ); function PassphraseScore( const Password : string ) : integer; function PassphraseStrength( const Password : string ) : TPassphraseStrength; implementation uses SysUtils, Math; function StringReverse( const Str : string ) : string; var idx : integer; begin Result := ''; for idx := 1 to Length( Str ) do Result := Str[ idx ] + Result; end; procedure PassphraseAnalyseEx( const Password : string; out PassphraseInfo : TPassphraseInfo ); const AlphasUC = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; AlphasLC = 'abcdefghijklmnopqrstuvwxyz'; Alphas = 'abcdefghijklmnopqrstuvwxyz'; Numerics = '0123456789'; Symbols = ')!@#$%^&*()'; MinLength = 8; MinAlphaUC = 1; MinAlphaLC = 1; MinNumber = 1; MinSymbol = 1; var a : integer; TmpAlphaUC, TmpAlphaLC, TmpNumber, TmpSymbol : integer; b : integer; CharExists : Boolean; S : integer; Fwd, Rev : string; pwd : string; begin // Initialisierung TmpAlphaUC := 0; TmpAlphaLC := 0; TmpNumber := 0; TmpSymbol := 0; pwd := StringReplace( Password, ' ', '', [ rfReplaceAll ] ); PassphraseInfo.Clear; PassphraseInfo.Length := Length( pwd ); // Durchsuche das Passwort nach Symbolen, Nummern, Groß- und Kleinschreibung for a := 1 to Length( pwd ) do begin // Großbuchstaben if Pos( pwd[ a ], AlphasUC ) >= 1 then begin if ( TmpAlphaUC > 0 ) then begin if ( TmpAlphaUC + 1 = a ) then begin inc( PassphraseInfo.ConsecAlphaUC ); inc( PassphraseInfo.ConsecCharType ); end; end; TmpAlphaUC := a; inc( PassphraseInfo.AlphaUC ); end // Kleinbuchstaben else if Pos( pwd[ a ], AlphasLC ) >= 1 then begin if ( TmpAlphaLC > 0 ) then begin if ( TmpAlphaLC + 1 = a ) then begin inc( PassphraseInfo.ConsecAlphaLC ); inc( PassphraseInfo.ConsecCharType ); end; end; TmpAlphaLC := a; inc( PassphraseInfo.AlphaLC ); end // Ziffern else if Pos( pwd[ a ], Numerics ) >= 1 then begin if ( a > 1 ) and ( a < Length( pwd ) ) then inc( PassphraseInfo.MidChar ); if ( TmpNumber > 0 ) then begin if ( TmpNumber + 1 = a ) then begin inc( PassphraseInfo.ConsecNumber ); inc( PassphraseInfo.ConsecCharType ); end; end; TmpNumber := a; inc( PassphraseInfo.Number ); end // Symbole else if Pos( pwd[ a ], AlphasLC + AlphasUC + Numerics ) < 1 then begin if ( a > 1 ) and ( a < Length( pwd ) ) then inc( PassphraseInfo.MidChar ); if ( TmpSymbol > 0 ) then begin if ( TmpSymbol + 1 = a ) then begin inc( PassphraseInfo.ConsecSymbol ); inc( PassphraseInfo.ConsecCharType ); end; end; TmpSymbol := a; inc( PassphraseInfo.Symbol ); end; // Doppelte Zeichen prüfen CharExists := False; for b := 1 to Length( pwd ) do if ( a <> b ) and ( pwd[ a ] = pwd[ b ] ) then begin CharExists := true; PassphraseInfo.RepInc := PassphraseInfo.RepInc + ( Length( pwd ) / Abs( b - a ) ); end; if CharExists then begin inc( PassphraseInfo.RepChar ); PassphraseInfo.UnqChar := Length( pwd ) - PassphraseInfo.RepChar; if PassphraseInfo.UnqChar <> 0 then PassphraseInfo.RepInc := Ceil( PassphraseInfo.RepInc / PassphraseInfo.UnqChar ) else PassphraseInfo.RepInc := Ceil( PassphraseInfo.RepInc ); end; end; // for a := 1 to Length( pwd ) do for S := 1 to Length( Alphas ) - 2 do begin Fwd := Copy( Alphas, S, 3 ); Rev := StringReverse( Fwd ); if ( Pos( Fwd, LowerCase( pwd ) ) >= 1 ) or ( Pos( Rev, LowerCase( pwd ) ) >= 1 ) then begin inc( PassphraseInfo.SeqAlpha ); inc( PassphraseInfo.SeqChar ); end; end; for S := 1 to Length( Numerics ) - 2 do begin Fwd := Copy( Numerics, S, 3 ); Rev := StringReverse( Fwd ); if ( Pos( Fwd, LowerCase( pwd ) ) >= 1 ) or ( Pos( Rev, LowerCase( pwd ) ) >= 1 ) then begin inc( PassphraseInfo.SeqNumber ); inc( PassphraseInfo.SeqChar ); end; end; for S := 1 to Length( Symbols ) - 2 do begin Fwd := Copy( Symbols, S, 3 ); Rev := StringReverse( Fwd ); if ( Pos( Fwd, LowerCase( pwd ) ) >= 1 ) or ( Pos( Rev, LowerCase( pwd ) ) >= 1 ) then begin inc( PassphraseInfo.SeqSymbol ); inc( PassphraseInfo.SeqChar ); end; end; if ( PassphraseInfo.AlphaLC + PassphraseInfo.AlphaUC > 0 ) and ( PassphraseInfo.Symbol = 0 ) and ( PassphraseInfo.Number = 0 ) then PassphraseInfo.AlphasOnly := Length( pwd ); if ( PassphraseInfo.AlphaLC + PassphraseInfo.AlphaUC = 0 ) and ( PassphraseInfo.Symbol = 0 ) and ( PassphraseInfo.Number > 0 ) then PassphraseInfo.NumbersOnly := Length( pwd ); if ( PassphraseInfo.Length > 0 ) and ( PassphraseInfo.Length >= MinLength ) then inc( PassphraseInfo.ReqChar ); if ( PassphraseInfo.AlphaUC > 0 ) and ( PassphraseInfo.AlphaUC >= MinAlphaUC ) then inc( PassphraseInfo.ReqChar ); if ( PassphraseInfo.AlphaLC > 0 ) and ( PassphraseInfo.AlphaLC >= MinAlphaLC ) then inc( PassphraseInfo.ReqChar ); if ( PassphraseInfo.Number > 0 ) and ( PassphraseInfo.Number >= MinNumber ) then inc( PassphraseInfo.ReqChar ); if ( PassphraseInfo.Symbol > 0 ) and ( PassphraseInfo.Symbol >= MinSymbol ) then inc( PassphraseInfo.ReqChar ); PassphraseInfo.Requirements := PassphraseInfo.ReqChar; end; function PassphraseScore( const Password : string ) : integer; var pi : TPassphraseInfo; begin PassphraseAnalyseEx( Password, pi ); Result := pi.Score; end; function PassphraseStrength( const Password : string ) : TPassphraseStrength; var pi : TPassphraseInfo; begin PassphraseAnalyseEx( Password, pi ); Result := pi.Strength; end; { TPassphraseInfo } procedure TPassphraseInfo.Clear; begin Length := 0; AlphaUC := 0; AlphaLC := 0; Number := 0; Symbol := 0; MidChar := 0; Requirements := 0; AlphasOnly := 0; NumbersOnly := 0; UnqChar := 0; RepChar := 0; RepInc := 0; ConsecAlphaUC := 0; ConsecAlphaLC := 0; ConsecNumber := 0; ConsecSymbol := 0; ConsecCharType := 0; SeqAlpha := 0; SeqNumber := 0; SeqSymbol := 0; SeqChar := 0; ReqChar := 0; MultConsecCharType := 0; end; function TPassphraseInfo.Score : integer; const MultLength = 4; MultRepChar = 1; MultMidChar = 2; MultRequirements = 2; MultConsecAlphaUC = 2; MultConsecAlphaLC = 2; MultConsecNumber = 2; MultConsecCharType = 0; MultConsecSymbol = 1; MultAlphaUC = 2; MultAlphaLC = 2; MultSeqAlpha = 3; MultSeqNumber = 3; MultSeqSymbol = 3; MultNumber = 4; MultSymbol = 6; begin Result := 0; // Additions Result := Result + Length * MultLength; if ( AlphaUC > 0 ) and ( AlphaUC < Length ) then Result := Result + ( Length - AlphaUC ) * MultAlphaUC; if ( AlphaLC > 0 ) and ( AlphaLC < Length ) then Result := Result + ( Length - AlphaLC ) * MultAlphaLC; if ( Number > 0 ) and ( Number < Length ) then Result := Result + Number * MultNumber; Result := Result + Symbol * MultSymbol; Result := Result + MidChar * MultMidChar; if Requirements > 3 then Result := Result + Requirements * MultRequirements; // Deducations Result := Result - AlphasOnly; Result := Result - NumbersOnly; Result := Result - Trunc( RepInc ); Result := Result - ConsecAlphaUC * MultConsecAlphaUC; Result := Result - ConsecAlphaLC * MultConsecAlphaLC; Result := Result - ConsecNumber * MultConsecNumber; Result := Result - SeqAlpha * MultSeqAlpha; Result := Result - SeqNumber * MultSeqNumber; Result := Result - SeqSymbol * MultSeqSymbol; if Result > 100 then Result := 100 else if Result < 0 then Result := 0; end; function TPassphraseInfo.ScoreStr : string; begin case Strength of psVeryWeak : Result := 'sehr schwach'; psWeak : Result := 'schwach'; psGood : Result := 'gut'; psStrong : Result := 'stark'; psVeryStrong : Result := 'sehr stark'; end; end; function TPassphraseInfo.Strength : TPassphraseStrength; var sc : integer; begin sc := Score; if sc >= 80 then Result := psVeryStrong else if sc >= 60 then Result := psStrong else if sc >= 40 then Result := psGood else if sc >= 20 then Result := psWeak else Result := psVeryWeak; end; end. azxopqfgby hat eine Passwordstärke von 9% . hat eine Passwordstärke von 10% Der zweite Wert ist schlichtwert absurd. |
![]() |
Registriert seit: 10. Aug 2007 609 Beiträge FreePascal / Lazarus |
#9
hab' gleich mal Satty67 und Sattttttty67 eingegeben (duck und weg...)
Ne, also sehr interessant. Man kann auch schön verfolgen, wie einzelne Eingaben bewertet werden. Allgemein geht es aber fast zu schnell Richtung 100%. Da bleibt wenig Luft für Leute, die komplexere Passwörter mögen. Aber das kann man sicher anpassen. Wenn man solche Einflussfaktoren wie Länge, Wörterbuch, Zufälligkeit, etc. nicht mit einbezieht, ist es bei weitem schlechter. Brechen wir es doch mal aufs einfachste und logischste herrunter. Wie definiert sich grundlegend die Passwortsicherheit? Aus der gegebenen Zeichenmenge und die Verwendung von möglichst vielen unterschiedlichen Zeichen aus dieser Zeichenmenge:
Delphi-Quellcode:
Sobald Doppelungen vorkommen ist es halt nicht mehr die maximal mögliche Sicherheit.
function GetPWSecurenessStandard(const AStr: string): Byte;
// Vereinfacht, man könnte zB nach der Überschreitung von MaxDfrntSgns auf die Unterschiedlichkeit prüfen (100% eig. nur erreichbar, wenn man die Länge des Inhalts kennen würde) function GetMaxDfrntSgns: Cardinal; begin Result := Round(Power(2, SizeOf(Char) * 8)); // Könnte auch sowas sein: // Result := Ord('z')+1-Ord('a') {+ Ord('Z')+1-Ord('A')}; end; function CntDfrntSgns: Cardinal; var i: Integer; DfrntSgns: string; begin for i := 1 to Length(AStr) do if Pos(AStr[i],DfrntSgns)<=0 then DfrntSgns := DfrntSgns + AStr[i]; Result := Length(DfrntSgns); end; var DfrntSgnsCnt: Cardinal; MaxDfrntSgns: Cardinal; begin MaxDfrntSgns := GetMaxDfrntSgns; if AStr = '' then begin Result := IfThen(MaxDfrntSgns = 0, 100, 0); Exit; end; DfrntSgnsCnt := CntDfrntSgns; if MaxDfrntSgns = DfrntSgnsCnt then Result := 100 else Result := Round(DfrntSgnsCnt / Length(AStr) * 100); end; Wenn man jetzt Einflussfaktoren, wie z.B. einen Längenfaktor des Passworts miteinbeziehen will, sollte man folgendes machen:
Delphi-Quellcode:
Und ich denke mal genau hier muss man selber weiterdenken. Denn man weiß nicht was für wen eine 100%ig sichere Länge ist. Genausowenig wie man mathematisch weiß was Zufall ist.
function GetPWSecurenessLengthFactored(const AStr: string): Byte;
const // Setze diese Einflussfaktoren auf ein Maximum, von denen du denkst das es 100% Sicherheit gewährleistet: MinSecurePWLength = 10; // Prozentuale Einflussfaktoren (0-100): SecurenessFactorOfPWLength = 50; begin if Length(AStr) >= MinSecurePWLength then Result := 100 else Result := Round(Length(AStr) / MinSecurePWLength * 100); Result := Round( (SecurenessFactorOfPWLength / 100 * Result) + (100 - SecurenessFactorOfPWLength) / 100 * GetPWSecurenessStandard(AStr) ); end; Jedoch, wenn man alle Passwörter der Welt kennen würde, könnte man eine favorisierte Passwörter-Liste miteinfließen lassen. Genauso könnte man auch favorisierte Zeichen, wie z.B.: 'a'..'z', 'A'..'Z' und die 'seltenen' Sonderzeichen mit einfließen lassen. Nur mathematisch lässt sich sowas nicht bestimmen. Zu guter letzt nochmal ein (nicht wiedergefundenes) Zitat von Hagen zu einem Faktor der maximalen Sicherheit: "Das Passwort muss genauso lang sein wie der Inhalt um die mathematisch maximale Sicherheit sicherzustellen?" Edit: Ui, sind da noch viele Beiträge zwichenzeitlich reingekommen. Hier nochmal Einflussfaktoren aufgelistet: - Passwortlänge - Die für das Passwort mögliche Zeichenmenge - Verwendung der Zeichenmenge (zB keine Dopplungen) - Häufigkeit eines verwendeten Passworts - Häufigkeit der verwendeten Zeichenmenge (- Situationsbedingt: Der bekannte verschlüsselte Inhalt, durch den sich auf das Passwort zurückschließen lässt) Also du hättest aus "Sattttttty67" -> "Sat!ty67" machen können. Dies wäre sicherer, da mehr unterschiedliche Zeichen aus der unbekannten Zeichenmenge verwendet würden. Geändert von mleyen (28. Sep 2010 um 12:55 Uhr) |
![]() |
Registriert seit: 24. Feb 2007 Ort: Baden 1.566 Beiträge Delphi 2007 Professional |
#10
Sobald Doppelungen vorkommen ist es halt nicht mehr die maximal mögliche Sicherheit.
Kann mir jemand irgendwie erklären, warum "ab" sicherer ist als "cc"? Wieso ist es einfacher herauszufinden, dass erst ein "c" kommt und danach noch ein "c"? Wieso ist es schwerer wenn ein "a" kommt, zu ermitteln, dass danach ein "b" kommt? Das ist auf den kleinsten Nenner reduziert, was ich irgendwie nicht ganz verstehen kann. Jetzt aber bitte nicht einfach, "weil 'ab' unterschiedliche Zeichen sind", das sehe ich auch ![]() *** Beides sind ja keine Passwörter aber wären Sie es, dann sieht für mich ein Angriff so aus: aa, ab, ac, ad ... ca, cb, cc "cc" dauert länger und "cccc" würde erheblich länger dauern. Vielleicht gibt es ja eine einfache Erklärung, die aufzeigt, warum das ein Irrglaube ist. Geändert von Satty67 (28. Sep 2010 um 15:18 Uhr) |
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |