phpBuddy

Webhosting Gutscheine

Auf der Suche nach einem top Provider? Dann lohnt ein Blick auf diesen Artikel - Gutscheine zum Geld sparen gibt's inklusive!

Sie sind hier: Startseite Quick Tip Index Passwortstärke prüfen
Passwortstärke prüfen

Die Stärke eines Benutzerpassworts prüfen

Man kann als Entwickler seine Anwendung noch so sicher programmieren, aber wenn Benutzer bei der Registrierung extrem unsichere Passwörter wählen, die leicht zu knacken oder zu erraten sind, eröffnet das den Bösen Buben (Spammer, Hacker, usw.) Tür und Tor um teilweise Schutzmechanismen zu unterwandern.
Um Anwender zur Verwendung von sicheren, oder zumindest sichereren, Passwörter zu motivieren, kann man als Entwickler etwas nachhelfen. Man kann die Stärke eines Passworts überprüfen, indem man das Passwort auf gewisse Merkmale hin untersucht und bei allzu einfachen Passwörtern die Verwendung verweigert.

Eine sehr einfache aber effektive Möglichkeit bildet ein Punktesystem. Sobald ein Passwort ein bestimmtes Kriterium für ein sicheres Passwort erfüllt, wird ein Punkt dazu addiert. Ab einer gewissen Punktzahl kann man ein Passwort dann als tauglich akzeptieren.
Zum überprüfen, ob Kriterien erfüllt wurden, greifen wir auf RegEx zurück. Die Ausdrücke selbst, bzw. was sich generell hinter RegEx versteckt, sind nicht Gegenstand dieses Quick Tips, sondern nur die praktische Umsetzung des Punktesystems.

Schauen wir uns nun zunächst einmal unsere HTML Beispielseite an, über die wir ein Passwort an unser Script übermitteln können, ehe wir dann zum PHP Teil kommen.


Beispielseite mit Tipps für ein sicheres Passwort

<!DOCTYPE html>
<html lang="de">
<head>
    <meta charset="utf-8" />
    <title>Formular mit Passwortstärke</title>
</head>
 
<body>
 
    <h3><?php echo $ausgabe; ?></h3>
 
    <form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
        <label for="passwort">Passwort: </label>
        <input type="text" name="passwort" id="passwort" value="<?php echo $pw; ?>" />
        <input type="submit" name="submit" id="submit" value="OK" />
    </form>
 
    <hr />
 
    <h4>Ein sicheres Passwort sollte diese Kriterien erfüllen:</h4>
    <ul>
        <li>Kleinbuchstaben</li>
        <li>Großbuchstaben</li>
        <li>Zahlen</li>
        <li>Sonderzeichen wie ! ? $ " / ( ] usw.</li>
        <li>Zeichenlänge - je länger je besser, mindestens 6 Zeichen, optimalerweise 15 oder mehr Zeichen</li>
        <li>Normale Wörter wie Vornamen, Stadtnamen, Gegenstände, usw. vermeiden</li>
    </ul>
</body>
</html>

Bevor es wieder eMails mit Beschwerden hagelt, hier noch ein Hinweis zum HTML Teil. Das ist nur eine Beispielseite um die Anwendung zu demonstrieren. Ja, es ist mir bewusst, dass man Passwörter nicht in Klartext Textfelder schreibt und dass man auch das Passwort nicht vorausfüllt. ;-)

Auf der Seite haben wir eine H3-Überschrift, die über den Status informiert. Je nach übermitteltem Passwort wird hier eine grobe Einschätzung angezeigt, wie unser System das Passwort einstuft. Aus praktischer Sicht wäre hier zu überlegen, dass man z.B. Passwörter mit einer zu niedrigen Wertung ablehnt und darauf besteht das ein sichereres Passwort verwendet wird. Kommen wir zum PHP Teil.


Passwortkriterien mit RegEx überprüfen

Der PHP Code ist sehr überschaubar, da er im Prinzip nur aus einigen IF-Abfragen und einer Switch für die Statusmeldung besteht.

// Variablen initialisieren
$ausgaben = '';
$staerke  = 0;
$pw       = '';
 
// Prüfen ob das Formular abgeschickt wurde
if (isset( $_POST['submit'] ) AND
    !empty( $_POST['passwort'] ))
{
    /************************************/
    /* Qualität des Passworts ermitteln */
    /************************************/
    // Passwort umladen um nachfolgend etwas Tipparbeit zu sparen ;-)
    $pw = $_POST['passwort'];
 
    // Prüfen ob Kleinuchstaben enthalten sind
    if (preg_match( "/[a-z]+/", $pw ))
    {
        // Stärkewert erhöhen
        $staerke++;
    }
 
    // Prüfen ob Großbuchstaben enthalten sind
    if (preg_match( "/[A-Z]+/", $pw ))
    {
        // Stärkewert erhöhen
        $staerke++;
    }
 
    // Prüfen ob Zahlen enthalten sind
    if (preg_match( "/\d+/", $pw ))
    {
        // Stärkewert erhöhen
        $staerke++;
    }
 
    // Prüfen ob Sonderzeichen (!, ?, $, Leerzeichen, usw.) enthalten sind
    if (preg_match( "/\W+/", $pw ))
    {
        // Stärkewert erhöhen
        $staerke++;
    }
 
    // Passwort Standardlänge (mindestens 6 Zeichen, maximal 15 Zeichen) prüfen
    if (strlen( $pw ) >= 6 AND
        strlen( $pw ) <= 15)
    {
        // Stärkewert erhöhen
        $staerke++;
    }
    // Passwort relativ sichere Länge (mehr als 15 Zeichen) prüfen
    elseif (strlen( $pw ) > 15)
    {
        // Stärkewert um 2 erhöhen, da die Passwortlänge das wichtigste Sicherheitskriterium darstellt
        $staerke = $staerke + 2;
    }
    // Zu kurzes Passwort wird auf niedrigsten Wert herabgestuft
    elseif (strlen( $pw ) < 6)
    {
        $staerke = 1;
    }
}
 
// Meldung für die Ausgabe
switch ($staerke)
{
    case 1 : $ausgabe = 'Das Passwort ist sehr schwach.'; break;
    case 2 : $ausgabe = 'Das Passwort ist schwach.'; break;
    case 3 : $ausgabe = 'Das Passwort ist OK aber nicht wirklich sicher.'; break;
    case 4 : $ausgabe = 'Das Passwort ist stark.'; break;
    case 5 : $ausgabe = 'Das Passwort ist sehr stark.'; break;
    case 6 : $ausgabe = 'So und nicht anders sollte ein sicheres Passwort aussehen!'; break;
    default: $ausgabe = 'Bitte ein Passwort eingeben.'; break;
}

Der Code ist schnell erklärt. Zunächst initialisieren wir einige benötigte Variablen. Danach wird geprüft, ob das Formular abgeschickt wurde und falls Ja prüfen wir das Passwort mit unseren Regulären Ausdrücken. Es wird geprüft ob das Passwort beinhaltet:

  • Kleinbuchstaben
  • Großbuchstaben
  • Zahlen
  • Sonderzeichen
  • Mindestlänge
  • (optional) optimale Länge

Wie erwähnt gehe ich jetzt nicht genauer auf die verwendeten RegEx ein, da das ein sehr komplexes Thema ist. Wer sich näher damit beschäftigen möchte -früher oder später führt kein Weg an RegEx vorbei, wenn man ernsthaft programmieren möchte- findet in meiner Linksammlung auf Learn The F***ing Basics auch Links zum Thema RegEx. Auf der Seite LTFB.de habe ich zu Themen rund um die Webentwicklung handverlesene Links veröffentlicht, die zu Seiten mit ganz besonders hochwertige und anfängerfreundliche Tutorials führen. So weit diese kurze Off Topic Information.

Nun, wie funktioniert das Punktesystem?
Das Passwort kann zwischen 1 bis 6 Punkte erreichen. Die Einschätzung der Punkte kann in der Switch abgelesen werden. Für die Erfüllung einer Kriterie, z.B. nur Kleinbuchstaben, wird 1 Punkt dazu addiert. Werden mehrere Kriterien erfüllt, z.B. Kleinbuchstaben, Zahlen, Sonderzeichen, wird für jedes Kriterium ein weiterer Punkt dazu addiert. Ausnahme hier bildet die Wortlänge. Die Länge eines Passworts ist das wichtigste Merkmal überhaupt. Extrem überlange Wörter tauchen in der Regel nicht in Wörterbüchern auf, die Angreifer gerne einsetzen um typische Passwörter zu erraten, und sind aufgrund der Länge nur sehr schwer mit der Brute Force Methode zu knacken, weil es einfach zu lange dauern würde. Andererseits nutzt einem auch ein Passwort bestehend aus Buchstaben, Sonderzeichen und Zahlen nichts, wenn es zu kurz ist, da es mittels Brute Force auf modernen Rechnern binnen Sekunden oder Minuten zu knacken ist. Die ausgewogene Mischung macht's! Für unser Punktesystem bedeutet das, dass ein zu kurzes Passwort (kürzer als 6 Zeichen), ungeachtet der Zusammensetzung, immer auf die niedrigst mögliche Punktezahl abgestraft wird, während ein sehr langes Passwort (länger als 15 Zeichen) einen 2-Punkte Bonus erhält.

Wie üblich findet man auf der Demo Seite das funktionierende Script und kann selbst einmal testen, wie das Punktesystem bei verschiedenen Passwörtern reagiert. Noch ein Hinweis: das Script speichert nichts ab, also kann man die Demo auch verwenden um die eigenen Passwörter einmal grob zu prüfen.

Das hier vorgestellte System soll nicht das ultimative Rating System darstellen. Es gibt Passwortstärke Tools da draußen die so aufgebläht und überladen sind, dass sie einem die halbe Applikation lahm legen, weil sie probieren etwas zu perfekt zu sein. Für eine grobe Einschätzung eines Passworts reicht die hier gezeigte Variante vollkommen aus.

Bis zum nächsten Quick Tip,
phpBuddy


Eine live Demo und den vollständigen Code findest Du auf der phpBuddy.eu Demo Seite.