![]() |
AW: Passwort-Stärke ermitteln (Code und Prüflogik)
(Sorry für Doppelpost, aber mit dem Code im Post oben, wäre das arg unübersichtlich geworden)
Zitat:
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. |
AW: Passwort-Stärke ermitteln (Code und Prüflogik)
Zitat:
|
AW: Passwort-Stärke ermitteln (Code und Prüflogik)
Liste der Anhänge anzeigen (Anzahl: 1)
Nein, Google lädt man sich vorher runter auf einen USB-Stick oder so... naja, wie gesagt, irgend etwas übersicht man immer ;) (Womit es aber auch beim Check leider nicht wirklich sinnvoll wäre)
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. |
AW: Passwort-Stärke ermitteln (Code und Prüflogik)
Diesen Password-Prüfer
![]() |
AW: Passwort-Stärke ermitteln (Code und Prüflogik)
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. |
AW: Passwort-Stärke ermitteln (Code und Prüflogik)
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. |
AW: Passwort-Stärke ermitteln (Code und Prüflogik)
Das ging ja fix :thumb:
Ich würde zwar noch etwas TPassphraseInfo.Score anpassen, damit mehr Luft nach oben ist, aber ansonsten sehr interessant. |
AW: Passwort-Stärke ermitteln (Code und Prüflogik)
Aus dem Grunde habe ich auch die Ermittlung der Einzelwerte und der Ermittlung des Scores entsprechend getrennt.
Dann ist die Erweiterung der Funktion erheblich einfacher. Zudem könnte man auch eine entsprechende Bewertungs-Information wie auf der Website anzeigen. |
AW: Passwort-Stärke ermitteln (Code und Prüflogik)
Gerade etwas gespielt, der Score halbiert gibt (gefühlt) gute Werte und vergleichbar mit den anderen beiden Funktionen.
Am besten das Passwort durch alle 3 jagen und den Mittelwert ausgeben :stupid: |
AW: Passwort-Stärke ermitteln (Code und Prüflogik)
Zitat:
klar bin ich mir auch über die Gefahren klar. Ein Passwort im Klartext zu verschicken ist zunächst nicht gefährlich, wenn keiner weiss, dass es ein (mögliches) Passwort ist. Aber würde sich mein Vorschlag allgemein durchsetzen, könnte google schnell auf die Idee kommen, für jeden Benutzer zu speichern, was der so anfragt, und daraus eine personalisierte Angriffsliste zu erstellen. An "don't be evil" glaube ich sowieso nicht, selbst wenn das ursprünglich mal ehrlich gemeint war. Für solche Software ist eine gut entwickelte Paranoia nicht unbedingt Voraussetzung, aber sie hilft doch sehr. Gruss Reinhard |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:18 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