Hi,
Ich brauche eine Funktion die Passwörter auf ihre Sicherheit prüft. Ich häng an der stelle wo untersucht werden soll wieviele kleinbuchstaben, großbuchstaben und zahlen oder zeichen im string enthalten sind.
Du bist Dir darüber im Klarem, das _alle_ Regeln gegen die Entropie arbeiten? D.h. auch die Regel, das ein Paßwort eben _nicht_ aus Worten bestehen soll, möglichst bunt durchmischt usw sind Regeln und machen bei strenger Einhaltung das Paßwort schlechter. Wenn Du deren Einhaltung rechentechnisch überprüfst und nur Paßworte zuläßt, die diesen Regeln entsprechen widerspricht das der Grundregel des Kryptographie "Sicherheit durch Verschleierung funktioniert nicht!", denn Du müßtest die Regeln, die Du anwendest geheim halten. Das kannst Du aber nicht, da man diese Regeln ja ausprobieren kann.
Wie nun ausbrechen aus dem Dilemma? Indem Du einfach sehr viele Regeln aufstellst, sie jedoch zufällig auswählst.
Zu kompliziert? Gut, dann der normale Weg ;-)
Ich bin nicht der PHP-Guru, deshlab möge man mich nicht nur für meinen Code ausschimpfen, sondern ihn dann bitte auch korrigieren, danke.
function islower($c){
return((ord($c)-97)<26&&(ord($c)-97)>=0)?1:0;
}
function isupper($c){
return ((ord($c)-65)<26&&(ord($c)-65)>=0)?1:0;
}
function isdigit($d){
return ((ord($d)-48)<10&&(ord($d)-48)>=0)?1:0;
}
function checkEntropy($pw, $length){
$num=$up=$low=$nas=0;
$avg=0.0;
for($x=0;$x<$length;$x++){
if(strchr($char,$pw{$x})) return -1; /* keine Doubletten */
$char .= $pw{$x};
if(isupper($pw{$x}))$up++; /* Großbuchstaben */
if(isdigit($pw{$x}))$num++; /* Zahlen */
if(ord($pw{$x})>128)$nas++; /* Umlaute usw */
if(islower($pw{$x}))$low++; /* Kleinuchstaben */
$avg += ord($pw{$x});
}
/* mindestens von jedem eines */
if($up == 0 || $num == 0 || $low == 0 || $nas == 0)
return -1;
/*Paßwortentropie an diesem Punkt ist 2,99<x<3 Bit/Oktet*/
/* Rückgabe des Durchschnittwertes aller Zeichen */
return $avg/8;
}
/*Du kannst auch noch die Umlaute in Groß/klein aufteilen:*/
function latin1_islower($c){
return ( ((ord($c)>=97)&&(ord($c)<=122))
||
((ord($c)>=223)&&(ord($c)<=255)&&(ord($c)!=247)))?1:0;
}
function latin1_isupper($c){
return ( ((ord($c)>=65)&&(ord($c)<=90))
||
((ord($c)>=192)&&(ord($c)<=222)&&(ord($c)!=215)) )?1:0;
}
so short
Christoph Zurnieden