php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 24.04.2008, 12:11  
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.032
lazydog befindet sich auf einem aufstrebenden Ast
Standard Passwort generieren

Oft kommt es vor, dass ein Benutzer sein Passwort vergisst. Da in jedem guten System die Passwörter mit einer Einwegverschlüsselung (sah1, md5 o.ä) gespeichert werden, muss diesen Benutzern ein neues PW zugewiesen werden. Die folgenden Funktionen generieren ein PW einer bestimmten Komplexität:
PHP-Code:
function gen_passwd($anz 8){ 
/*
**    Function:      Generate password
**
**    Parameter:     Integer $anz   Minimal length of password        default: 8
**
**    Return value:  String:        Generated password
*/
    
$z1 range(3347);   // Kein O (Buchstabe) und kein 0 (Null)
    
$z2 range(4978);
    
$z3 range(80126);
    
$zeichen array_merge($z1$z2$z3);    // Erlaubte Zeichen
    
do{
        
$passw '';
        
shuffle($zeichen);                    // Zeichenvorat mischen
        
for($i 0;$i $anz;$i ++){          // $anz Zeichen auslesen
            
$passw .= chr($zeichen[$i]);
        }
    } while(!(
pw_ok($passw$anz)));          // Konsistenz prüfen
    
return $passw;

Prüfen, ob das PW der geforderten Komplexität (mindestens je einen Gross- und Kleinbuchstaben, ein Sonderzeichen und eine Ziffer) vorhanden ist. Kann natürlich auch zur Prüfung einer Passwortänderng durch den Benutzer verwendet werden
PHP-Code:
function pw_ok($passw$length 8){
/*
**    Function        Checks consistency of a password
**                    The password must consist of at least one digit,
**                    lower- und uppercase letter and a special sign,
**                    and the length must be at least $length characters
**
**    Parameter:      String: $passw         Password
**                    Integer $length        Minimal length of the PW
**
**    Return value:   Boolean
*/
    
if (strlen($passw) < $length){        // Passwort zu kurz
        
return false;
    }
    return 
preg_match('/[[:digit:]]/'$passw) &&         // Ziffern
           
preg_match('/[[:lower:]]/'$passw) &&         // Kleinbuchstaben
           
preg_match('/[[:upper:]]/'$passw) &&         // Grossbuchstaben
           
preg_match('/[[:punct:]]/'$passw);           // Sonderzeichen

__________________
Gruss
L

Geändert von lazydog (24.04.2008 um 14:11 Uhr).
lazydog ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 24.04.2008, 13:09  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Zwei Kritikpunkte:
  • Wenn schon Pflichtzeichen erzwungen werden, würde ich anstatt der nicht-deterministischen Schleife aus Erstellen und Testen eher ein Passwort mit n-m Zeichen erstellen, wobei n die gewünschte Länge und m die Anzahl an (unterschiedlichen) Pflichzeichen ist und dann die Pflichtzeichen hinzufügen und alles durchmischen.
  • Die Empfehlung für Klein-/Großbuchstaben, Zahlen und Sonderzeichen gibt es doch eigentlich, damit Benutzer möglichst keine einfachen (einfach zu erratenden) Worte wählen (Name der Tochter, hallo, 12345, usw). Bei einem zufällig erzeugten Passwort fällt das (bis auf ganz große Zufälle) weg.
    Dein Alphabet umfasst 92 Zeichen. Mit $length=8 gibt es nicht mehr als 92^8 Möglichkeiten (durch die Pflichtzeichen sogar etwas weniger). Jetzt wähle ich als Alphabet nur 1234567890abcdefghjkmnpqrstuvwxyz (kein o, kein i, kein l) also 33 Zeichen und $lenght=10 oder $length=11
    PHP-Code:
    echo bcpow('92''8') . "\n";
    echo 
    bcpow('33''10') . "\n";
    echo 
    bcpow('33''11') . "\n"
    PHP-Code:
    5132188731375616
    1531578985264449
    50542106513726817 
    10 Zeichen reichen nicht, aber mit $length=11 ergeben sich mit dem verkleinerten, aber leichter zu tippenden Alphabet mehr Möglichkeiten (ich kann sogar noch 1 und 0 rausschmeißen und damit alle il1 und o0 Verwechslungen ausschließen ). Stellen wir noch eine Zahl an den Anfang (gegen die großen Zufälle), haben wir ein 12-stelliges Passwort. Dass kann man benutzerfreundlich in 3x4-Zeichen-Blocks darstellen.
David ist offline   Mit Zitat antworten
Alt 24.04.2008, 14:10  
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.032
lazydog befindet sich auf einem aufstrebenden Ast
Standard

Deinen ersten Einwand verstehe ich nicht ganz. Bei Tests habe ich einfach festgestellt, dass in etwa 45% der Fälle das Passwort schon im ersten Durchgang vergeben wird. Im Schnitt sind es knapp 2.1 Durchgänge, was ich, da es sich doch um eine nicht so häufig benutzte Funktion handelt, für vertretbar halte.
Und mit dem zweiten hast du natürlich recht, mit der Anzahl Möglichkeiten. Die Funktionen stammen aber aus einem konkreten (Intranet-)Projekt und die Bedingungen waren so vorgegeben (allerdings für ein vom Benutzer gesetztes Passwort). Ich habe dann einfach auf das generierte Passwort die gleichen Regeln übernommen.
Und da im Normalfall das Passwort nach der ersten Benutzung geändert werden muss, wenn es etwas komliziert daherkommt.
__________________
Gruss
L
lazydog ist offline   Mit Zitat antworten
Alt 24.04.2008, 14:31  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Der erste Punkt teilt sich in zwei Unterpunkte.
Zitat:
Zitat von lazydog
Im Schnitt sind es knapp 2.1 Durchgänge
Es kann aber eben auch 5, 10 oder 10 Millionen Durchgänge dauern. (Sehr) Unwahrscheinlich aber möglich.
Und Testen und Erstellen sind nicht fest an die selben Regeln gebunden. Das spielt hier keine große Rolle, weil alles überschaubar ist. Aber der Robustheit wegen müssten das Erstellen und der Test stärker aneinander gekoppelt sein. Also zum Beispiel, wenn Du beim selben Modul, dass preg_match bereit stellt, nachfragen könntest
Zitat:
Gib mir alle Symbole der Menge [[:digit:]]
genauso für [[:lower:]]
genauso für [[:upper:]]
genauso für [[punct:]]
Daraus dann die vereinigte Menge bilden, eventuell noch Symbole hinzufügen und dann aus diesem Pool das Passwort erstellen.
Aber egal, für das Hier und Jetzt etwas abgehobene Gedanken. Einfach ignorieren
David ist offline   Mit Zitat antworten
Alt 02.05.2008, 21:17  
Erfahrener Benutzer
 
Registriert seit: 29.02.2008
Beiträge: 102
Thomas befindet sich auf einem aufstrebenden Ast
Standard

Hallo,

Hier eine Methode einer Klasse die ich damals zu meiner aktiven Programmiererzeit geschrieben habe. 100% Trefferquote und sehr übersichtlicher Code.

PHP-Code:
public static function GetRandomPassword()
    {
        
$password = (string)'';
        
$password .= mt_rand(09);
        
$password .= chr(mt_rand(97122));
        
$password .= chr(mt_rand(6590));
        
        for (
$i 0$i 5$i++)
        {
            Switch (
mt_rand(02))
            {
                case 
0:
                    
$password .= mt_rand(09);
                    break;
                case 
1:
                    
$password .= chr(mt_rand(97122));
                    break;
                case 
2:
                    
$password .= chr(mt_rand(6590));
                    break;
            }
        }
        
$password str_shuffle($password);
        
        return 
$password;
   } 
Gruß Thomas
Thomas ist offline   Mit Zitat antworten
Alt 22.05.2008, 06:22  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.267
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Leider nicht dokumentiert

Mich wuerde eine Funktion interessieren, die lesbare Passwoerter generiert, also Vokale beruecksichtigt und einbaut. Wenn da jemand grad was hat kann er es ja posten; googlen kann ich aber selber, falls nicht.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 22.05.2008, 11:46  
Erfahrener Benutzer
 
Benutzerbild von litterauspirna
 
Registriert seit: 24.04.2008
Beiträge: 3.172
PHP-Kenntnisse:
Anfänger
litterauspirna sorgt für eine eindrucksvolle Atmosphärelitterauspirna sorgt für eine eindrucksvolle Atmosphäre
litterauspirna eine Nachricht über ICQ schicken
Standard

Hallo @ All!

Also die hier ist mein kleiner Passwortgenerator der richtig gut funktioniert!

PHP-Code:
function passwort_create($zeichen 8)
{
 
$chars array_merge(
        
range(09),
        
range('a''z'),
        
range('A''Z')
    );
    
shuffle($chars);
    return 
implode(''array_slice($chars0$zeichen)); 
}
 
//Zum Funktion benutzen
$new_passwort passwort_create(); 
Die Variable $new_passwort kann dann per E-Mail verschickt werden
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de
litterauspirna ist offline   Mit Zitat antworten
Alt 22.05.2008, 12:02  
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.032
lazydog befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von litterauspirna Beitrag anzeigen
Also die hier ist mein kleiner Passwortgenerator der richtig gut funktioniert!
Nur hast du dabei keine Kontrolle, ob das Passwort auch komlex genug ist, d.h. auch aus allen Klassen mindestens ein Zeichen enthält. Ausserdem schliesst du Sonderzeichen aus, die eigentlich wesentlich zu sichereren Passwörten beitragen können.

Das gilt übrigens alles auch für das Beispiel von Thomas
__________________
Gruss
L
lazydog ist offline   Mit Zitat antworten
Alt 22.05.2008, 12:12  
Erfahrener Benutzer
 
Benutzerbild von litterauspirna
 
Registriert seit: 24.04.2008
Beiträge: 3.172
PHP-Kenntnisse:
Anfänger
litterauspirna sorgt für eine eindrucksvolle Atmosphärelitterauspirna sorgt für eine eindrucksvolle Atmosphäre
litterauspirna eine Nachricht über ICQ schicken
Standard

Hmm das ist natürlich ein gutes Argument! Danke werde dies mal berücksichtigen!
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de
litterauspirna ist offline   Mit Zitat antworten
Alt 22.05.2008, 12:19  
Erfahrener Benutzer
 
Registriert seit: 29.02.2008
Beiträge: 102
Thomas befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von lazydog Beitrag anzeigen
Nur hast du dabei keine Kontrolle, ob das Passwort auch komlex genug ist, d.h. auch aus allen Klassen mindestens ein Zeichen enthält. Ausserdem schliesst du Sonderzeichen aus, die eigentlich wesentlich zu sichereren Passwörten beitragen können.

Das gilt übrigens alles auch für das Beispiel von Thomas
Hi,

Das war damals die Anforderung, dass keine Sonderzeichen verwendet werden dürfen.

Gruß Thomas
Thomas ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es 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 an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Passwort generieren Chriz Scriptbörse 8 11.07.2008 08:24
bildanzeige bei falschem passwort chrissie PHP Tipps 2006 1 22.08.2006 15:37
Eingabefenster für Passwort Nevermind PHP Tipps 2007 10 18.12.2005 15:36
Passwort vergessen - Formular PHP Tipps 2005-2 2 31.10.2005 10:40
Passwort generieren tomtaz PHP Tipps 2005-2 4 03.08.2005 14:35
Passwort zufällig generieren = gefährlich PHP Tipps 2005-2 12 20.07.2005 10:42
[Erledigt] Passwort und Nutzerverwaltung in Php und Mysql PHP Tipps 2005-2 7 23.06.2005 17:46
3 Seiten durch Passwort schützen mit einmaliger PW-Eingabe? PHP Tipps 2005 12 19.04.2005 22:41
[Erledigt] root passwort ändern Datenbanken 1 09.03.2005 07:50
Passwort geschützte Seite - PHP ohne MySQL PHP Tipps 2004-2 3 29.12.2004 18:26
[Erledigt] Passwort vergessen-Script PHP Tipps 2004-2 8 11.11.2004 18:56
Passwort übergeben duerov PHP Tipps 2004 5 27.09.2004 09:41
Passwort verschlüsselung Datenbanken 5 06.09.2004 10:31
benutzername + passwort pruefen PHP Tipps 2004 4 07.07.2004 16:14
Passwort generieren Clan-Opa PHP Tipps 2004 5 02.07.2004 15:27

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php passwort generieren, passwort generieren php, php passwort generator, php kennwort generieren, php passwort generieren funktion, php password generieren, php passwort erzeugen, php passwörter generieren, php neues passwort generieren, lesbare passwörter generieren, php funktion passwort generieren, php passwort komplexität, passwort generator lesbar, lesbare passwörter, passwort generator php, php passwort, passwörter generieren php, password generieren, password generieren php, passwort erzeugen php

Alle Zeitangaben in WEZ +2. Es ist jetzt 23:25 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum