Frage

Ich war auf der Suche nach einem effektiven Algorithmus, den mir eine genaue Vorstellung davon, wie stark ein Passwort geben kann.

Ich fand, dass mehrere verschiedene Websites verschiedene Algorithmen verwenden, wie ich verschiedene Passwort Stärke-Ratings auf verschiedenen Websites.

War es hilfreich?

Lösung

Dies ist für die Arbeit mit Passwörtern in PHP / MySQL zu meinem allgemeinen brain dump bewährten Verfahren gezüchtet. Die hier vorgestellten Ideen sind in der Regel nicht meine eigenen, aber das Beste, was ich bisher gefunden habe.


Stellen Sie sicher, Sie SSL für alle Operationen verwenden Benutzerinformationen beinhaltet. Alle Seiten, die diese Formen beinhalten sollten überprüfen sie über HTTPS genannt werden, und sich weigern, anders zu arbeiten.

Sie können die meisten Angriffe beseitigen, indem einfach die Anzahl der fehlgeschlagenen Anmeldungen erlaubt zu begrenzen.

Lassen Sie für relativ schwache Passwörter, aber die Anzahl fehlgeschlagener Anmeldungen pro Benutzer speichern und einen Captcha oder Passwortüberprüfung per E-Mail benötigen, wenn Sie es nicht überschreiten. Ich habe meine max Ausfälle bis 5.

Geben Login Ausfälle an den Benutzer muss sorgfältig durchdacht werden, um keine Informationen zu Angreifern bieten. Ein fehlgeschlagener Anmelde aufgrund eines nicht vorhandenen Benutzer soll die gleiche Nachricht als eine fehlgeschlagene Login aufgrund eines schlechten Passwort zurück. eine andere Meldung angeben, können Angreifer gültige Benutzer-Logins bestimmen.

Auch stellen Sie sicher, dass das Rück genau die gleiche Nachricht im Falle eines Fehlers zu viele Anmeldungen mit einem gültigen Passwort und einen Fehler mit zu vielen Anmeldungen und ein falsches Kennwort. eine andere Meldung angeben, können Angreifer gültige Benutzer-Passwörter bestimmen. Eine angemessene Anzahl von Benutzern, wenn gezwungen, ihr Passwort zurücksetzen wird es einfach zurück setzen, was es war.

Leider erlaubt die Anzahl der Anmeldungen Begrenzung pro IP-Adresse ist nicht praktikabel. Einige Anbieter wie AOL und die meisten Unternehmen Proxy ihre Web-Anfragen. Diese Grenze bedrängt wird diesen Benutzer effektiv beseitigen.


Ich habe festgestellt, bevor die Überprüfung für Wörterbuch Wörter einreichen ineffizient sein, da müssen Sie entweder ein Wörterbuch an den Client in Javascript schicken, oder eine Ajax-Anfrage pro Feldänderung senden. Ich tat dies für eine Weile und es funktionierte ok, aber nicht wie der Verkehr es erzeugt wird.

Überprüfen auf inhärent schwache Passwörter minus Wörterbuch Worten ist praktisch Client-Seite mit einigen einfachen Javascript.

Nach einreichen, überprüfe ich für Wörter aus dem Wörterbuch und Benutzernamen enthält, Passwort und vice versa Serverseite. Sehr gute Wörterbücher sind leicht downloadbare und die Prüfung gegen sie ist einfach. Ein Gotcha hier ist, dass zum Test für ein Wort aus dem Wörterbuch, benötigen Sie eine Abfrage der Datenbank zu senden, das das Passwort erneut enthält. Die Art, wie ich um dieses bekam, war mein Wörterbuch, bevor die Hand mit einer einfachen Verschlüsselung zu verschlüsseln und positioniert SALT beenden und dann für das verschlüsselte Passwort testen. Nicht ideal, aber besser als Klartext und nur auf dem Draht für die Menschen auf dem physischen Maschinen und Subnetz.

Wenn Sie sind zufrieden mit dem Passwort sie verschlüsseln sie mit PHP zuerst ausgewählt haben, dann speichern. Die folgende Passwort Verschlüsselungsfunktion ist nicht meine Idee auch nicht, aber löst eine Reihe von Problemen. Encrypting innerhalb PHP verhindert Menschen auf einem gemeinsamen Server von unverschlüsselten Passwörter abfangen. Hinzufügen etwas pro Benutzer, die sich nicht ändern (Ich benutze E-Mail, da dies der Benutzername für meine Websites ist) und fügen Sie einen Hash (SALT ist eine kurze konstante String-I pro Standort ändern) erhöht die Beständigkeit gegen Angriffe. Weil das Salz im Passwort befindet, und das Kennwort kann beliebig lang sein, wird es fast unmöglich, dies mit einer Regenbogen-Tabelle zu attackieren. es bedeutet, abwechselnd auch, dass die Menschen nicht ihre E-Mails ändern können, und Sie können nicht das Salz ändern, ohne wenn jeder das Passwort ungültig zu machen.

EDIT: Ich würde jetzt empfehlen PhPass statt meiner Rolle hier Ihre eigene Funktion, oder einfach nur vergessen Benutzeranmeldungen insgesamt und benutzen OpenID statt.

function password_crypt($email,$toHash) {
  $password = str_split($toHash,(strlen($toHash)/2)+1);
  return hash('sha256', $email.$password[0].SALT.$password[1]); 
}

Meine Jqueryish Client-Seite Passwort Meter. Ziel sollte ein div sein. Es ist Breite zwischen 0 und 100 und Hintergrundfarbe auf der Grundlage der Klassen ändert sich i ändern wird bezeichnetn das Skript. Wieder meist von anderen Dingen gestohlen habe ich gefunden:

$.updatePasswordMeter = function(password,username,target) {
$.updatePasswordMeter._checkRepetition = function(pLen,str) {
res = ""
for ( i=0; i<str.length ; i++ ) {
    repeated=true;
    for (j=0;j < pLen && (j+i+pLen) < str.length;j++)
        repeated=repeated && (str.charAt(j+i)==str.charAt(j+i+pLen));
    if (j<pLen) repeated=false;
    if (repeated) {
        i+=pLen-1;
        repeated=false;
    }
    else {
        res+=str.charAt(i);
    };
};
return res;
};
var score = 0;
var r_class = 'weak-password';
//password < 4
if (password.length < 4 || password.toLowerCase()==username.toLowerCase()) { 
target.width(score + '%').removeClass("weak-password okay-password good-password strong-password"
).addClass(r_class);
  return true;
} 
//password length
score += password.length * 4;
score += ( $.updatePasswordMeter._checkRepetition(1,password).length - password.length ) * 1;
score += ( $.updatePasswordMeter._checkRepetition(2,password).length - password.length ) * 1;
score += ( $.updatePasswordMeter._checkRepetition(3,password).length - password.length ) * 1;
score += ( $.updatePasswordMeter._checkRepetition(4,password).length - password.length ) * 1;
//password has 3 numbers
if (password.match(/(.*[0-9].*[0-9].*[0-9])/))  score += 5; 

//password has 2 symbols
if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) score += 5; 

//password has Upper and Lower chars
if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/))  score += 10; 

//password has number and chars
if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/))  score += 15; 
//
//password has number and symbol
if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([0-9])/))  score += 15; 

//password has char and symbol
if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([a-zA-Z])/))  score += 15; 

//password is just a nubers or chars
if (password.match(/^\w+$/) || password.match(/^\d+$/) )  score -= 10; 

//verifing 0 < score < 100
score = score * 2;
if ( score < 0 )  score = 0;
if ( score > 100 )  score = 100;
if (score > 25 ) r_class = 'okay-password';
if (score > 50  ) r_class = 'good-password';
if (score > 75 ) r_class = 'strong-password';
target.width(score + '%').removeClass("weak-password okay-password good-password strong-password"
).addClass(r_class);
return true;
};

Andere Tipps

Im Grunde wollen Sie zu den wichtigsten Arten von Angriffen verhindern

  • Wörterbuch Angriffe
  • Brute-Force-Angriffe

Um die erste zu verhindern, möchten Sie Passwörter prüfen, mit gemeinsamen Worten schwach. Um die zweiten zu verhindern, können Sie Passwörter von angemessener Länge fördern wollen (8+ Zeichen gemeinsam ist) und mit einem recht großen Zeichensatz (Buchstaben, Zahlen und Sonderzeichen). Wenn Sie Kleinbuchstaben und Großbuchstaben betrachten, anders zu sein, erhöht, dass die im Wesentlichen eingestellt Charakter. Doch dies schafft ein Usability-Problem für einige User-Communities, so dass Sie, dass die Prüfung balancieren müssen.

Eine schnelle Google-Suche aufgedreht Lösungen, die für Brute-Force-Angriffe (komplexes Passwort) Konto, aber nicht für Wörterbuch-Attacken. PHP Passwort Strength Meter von dieser Liste die Stärke Kontrolleure die Kontroll Server-Seite läuft, so dass es erweitert werden, um ein Wörterbuch zu überprüfen.

EDIT:

Übrigens ... Sie sollten auch die Anzahl der Anmeldeversuche pro Benutzer begrenzen. Diese werden beide Arten von Angriffen weniger wahrscheinlich machen. Wirksam, aber nicht benutzerfreundlich ist ein Konto, nachdem X schlecht versucht zu sperren und das Zurücksetzen des Kennworts erforderlich. Benutzerfreundlicher, aber mehr Aufwand ist zu Gas Zeit zwischen Anmeldeversuchen. Sie können auch CAPTCHA erfordern nach den ersten Login-Versuchen (was etwas ist, die Stack-Überlauf nach zu vielen Änderungen erfordert oder für sehr neuen Benutzer).

Im Grunde wollen Sie wahrscheinlich Reguläre Ausdrücke verwenden, um die Länge und Komplexität des Passwortes zu überprüfen.

Ein gutes Beispiel dieser mit Hilfe von Javascript zu tun ist hier zu finden:

http://marketingtechblog.com/programming/javascript-password-strength/

Wie Daren Schwenke darauf hingewiesen, solltest du besser Arbeit auf die Sicherheit selbst und nicht in den Benutzer Hände legen .

Aber es ist gut, ein paar Hinweise für den Benutzer zur Verfügung zu stellen, wie stark sein Passwort ist, weil der beste Weg, um ein Passwort zu bekommen, ist nach wie vor sozialer engenering .

So können Sie ein kleines Client-seitiges Script hackt, die das Benutzerkennwort als Gefälligkeit Indikatoren strenght prüft in Echtzeit. Es blockiert nichts, sondern gibt ihm ein gutes warmes Gefühl, wenn es leuchtet grün: -)

Im Grunde, was Sie muss prüfen, ist commom Sinn: prüfen, ob das Passwort Buchstaben enthält, Zahlen und nicht alphabetisch caracters, in einer angemessenen Menge

.

Sie können Ihre eigenen algo sehr leicht hacken: nur 10.10 Marke machen:

  • 0 eine Null Länge Passwort;
  • 2 für alle 8 caracters in dem Passwort (15 sollte eine sichere Länge sein);
  • 1 für die Verwendung eines Briefes, +2 für die Verwendung von 2 Buchstaben;
  • 1 für die Verwendung einer Reihe, zwei für die Verwendung von 2-Nummern;
  • 1 für die Verwendung eines nicht alphabetisch caracters, +2 für 2 Personen.

Sie müssen nicht für gottähnlich Passwörter überprüfen (dort Buchstaben groß geschrieben, wo die speziellen caracters positioniert sind, usw.), die Benutzer sind nicht in der Bank / Militär / Geheimdienst / Monty Python-Filme Industrie, sind sie?

Sie können das in in einer Stunde Code ohne verrückt Javascript Fähigkeiten.

Und überhaupt, das Passwort gültig und bewegen alle den Sicherheitscode auf der Serverseite. Wenn Sie Authentifizierung delegieren (z: Open ID)., Noch besser

Ich kann nicht glauben, von einem bestimmten Algorithmus, um die strengh eines Passworts zu überprüfen. Was wir tun, ist, dass wir mehrere Kriterien definieren und wenn das Kennwort ein Kriterien einhalten, fügen wir 1 in seine Partitur. Wenn das Passwort einen Schwellenwert erreicht, ist das Passwort stark. Ansonsten ist es schwach.

Sie können viele verschiedenen Level von strengh definieren, wenn mit verschiedenen throeshold, oder Sie können unterschiedliche Werte für ein bestimmten Kriterien definieren. wenn ein Passwort 5 Zeichen hat zum Beispiel, fügen wir 1, aber wenn es 10 bekommt, dann fügen wir 2.

Hier ist eine Liste von Kriterien zu überprüfen

Länge (8 bis 12 ist ok, mehr ist besser) Enthält Kleinbuchstaben Enthält Großbuchstaben Der Großbuchstabe ist nicht der erste. enthält Nummer enthält Symbole das letzte Zeichen ist nicht ein Mensch wie Symbol (z. B.: oder!) Sieht nicht wie ein Dictionnary Wort. Einige weise Passwort zu knacken enthält Bibliothek von Wörtern und Zeichen ersetzt (wie Bibliothek -> L1br @ ry)

Hoffnung, dass Hilfe.

Rollen Sie nicht-Your-Own!

Cryptography Experten entmutigen Roll-your-own-Kryptographie aus Gründen, die offensichtlich sein sollten.

Für die ganz gleichen Gründen sollte man nicht versuchen, seine eigene Lösung für das Problem rollen eines Passworts Stärke zu messen; es ist sehr viel ein kryptographisches Problem.

Lassen Sie sich nicht in die hässlichen Unternehmen zu diesem Zweck einig massiven regulären Ausdruck von Authoring; Sie werden wahrscheinlich mehrere Faktoren scheitern, dass eine allgemeine Stärke des Passworts beeinflussen zu berücksichtigen.

Es ist ein schwieriges Problem

Es gibt erhebliche Schwierigkeiten inhärent das Problem eines Passworts Stärke zu messen. Je mehr Forschung, die ich zu diesem Thema durchführen, desto mehr wird mir klar, dass dies ein „unidirektionale“ Problem ist; das heißt, kann man nicht die „Schwierigkeit“ (Rechenaufwand) misst ein Passwort Knacken effizient . Vielmehr ist es effizienter, Komplexitätsanforderungen zu bieten und die Fähigkeit des Passwortes zu messen, um sie zu treffen.

Wenn wir das Problem logisch, ein „crackability Index“ berücksichtigt nicht viel Sinn machen, so bequem wie es sich anhört. Es gibt so viele Faktoren, die die Berechnung treiben, von denen die meisten auf die Rechenressourcen beziehen sich auf den Krackverfahren gewidmet, so als unpraktisch.

Stellen Sie sich vor Lochfraß John the Ripper (oder ein ähnliches Werkzeug) gegen das Passwort in Frage; es könnte Tage dauern, ein ordentliches Passwort, Monate zu knacken ein gutes Passwort zu knacken, und bis die Sonne brennt-out ein außergewöhnliches Passwort zu knacken. Dies ist kein praktisches Mittel, durch die Passwortstärke zu messen.

, um das Problem aus der anderen Richtung Annäherung ist weit mehr überschaubar: wenn wir eine Reihe von Komplexitätsanforderungen liefern, dann ist es möglich, die relative Stärke eines Passworts zu beurteilen, sehr schnell. Offensichtlich sind die gelieferten Komplexitätsanforderungen müssen im Laufe der Zeit entwickeln, aber es gibt weit weniger Variablen, für die berücksichtigen, wenn wir das Problem auf diese Weise nähern.

eine durchführbare Lösung

Es ist ein Standalone-Programm von Openwall zur Verfügung berechtigt passwdqc (vermutlich steht für Passwort Quality Checker ). Openwall Entwickler, Solar Designer, erscheint eine bona fide Kryptographie-Experte (seine Werke sprechen für sich) zu sein, und so ist qualifiziert, ein solches Instrument Autor.

Für meinen speziellen Anwendungsfall, das ist eine weit attraktivere Lösung als die Verwendung eines unausgegoren JavaScript-Snippet in einer dunklen Ecke des Web zu leben.

Parameter für Ihre speziellen Bedürfnisse Aufbau ist der schwierigste Teil. Die Implementierung ist der einfache Teil.

Ein Beispiel aus der Praxis

Ich biete eine einfache Implementierung in PHP eine Starthilfe zur Verfügung zu stellen. Standard Haftungsausschluss gelten.

Dieses Beispiel geht davon aus, dass wir eine ganze Liste von Passwörtern an den PHP-Skript sind Fütterung. Es versteht sich, dass, wenn Sie diese mit echten Passwörter tun (zum Beispiel jene abgeladen aus einem Passwort-Manager) sollten extreme Vorsicht im Hinblick auf die Passwort-Handhabung ausgeübt werden. das unverschlüsselte Passwort-Dump auf der Festplatte gefährdet die Sicherheit Ihrer Passwörter einfach zu schreiben!

passwords.csv:

"Title","Password"
"My Test Password","password123"
"Your Test Password","123456!!!"
"A strong password","NFYbCoHC5S7dngitqCD53tvQkAu3dais"

password-check.php:

<?php

//A few handy examples from other users:
//http://php.net/manual/en/function.str-getcsv.php#117692

$csv = array_map('str_getcsv', file('passwords.csv'), [',']);

array_walk($csv, function(&$a) use ($csv) {
    $a = array_combine($csv[0], $a);
});

//Remove column header.

array_shift($csv);

//Define report column headers.

$results[] = [
    'Title',
    'Result',
    'Exit Code',
];

$i = 1;

foreach ($csv as $p) {
    $row['title'] = $p['Title'];

    //If the value contains a space, it's considered a passphrase.

    $isPassphrase = stristr($p['Password'], ' ') !== false ? true : false;

    $cmd = 'echo ' . escapeshellarg($p['Password']) . ' | pwqcheck -1 min=32,24,22,20,16 max=128';

    if ($isPassphrase) {
        $cmd .= ' passphrase=3';
    }
    else {
        $cmd .= ' passphrase=0';
    }

    $output = null;
    $exitCode = null;

    $stdOut = exec($cmd, $output, $exitCode);

    //Exit code 0 represents an unacceptable password (not an error).
    //Exit code 1 represents an acceptable password (it meets the criteria).

    if ($exitCode === 0 || $exitCode === 1) {
        $row['result'] = trim($stdOut);
        $row['exitCode'] = $exitCode;
    }
    else {
        $row['result'] = 'An error occurred while calling pwqcheck';
        $row['exitCode'] = null;
    }

    $results[$i] = $row;

    $i++;
}

$reportFile = 'report.csv';

$fp = @fopen($reportFile, 'w');

if ($fp !== false) {
    foreach ($results as $p) {
        fputcsv($fp, $p);
    }

    fclose($fp);
}
else {
    die($reportFile . ' could not be opened for writing (destination is not writable or file is in use)');
}

exit;

Resultierende report.csv:

Title,Result,"Exit Code"
"My Test Password","Bad passphrase (too short)",1
"Your Test Password","Bad passphrase (too short)",1
"A strong password",OK,0

Wrapping-Up

Ich habe noch eine gründlichere Lösung auf dem Web zu finden; Unnötig zu sagen, ich begrüße alle anderen Empfehlungen.

Offensichtlich ist dieser Ansatz nicht ideal für bestimmte Anwendungsfälle ist (zum Beispiel eines „Passwortstärkeanzeiger“ implementiert „client-side“). Trotzdem wäre es trivial sein, einen AJAX-Aufruf zu einer serverseitigen Ressource zu machen, dass ein Pass zurück / Fail-Reaktion unter Verwendung der oben geschilderten Ansatz, aber ein solcher Ansatz sollte die davon ausgehen,Missbrauchspotential (zum Beispiel DoS-Attacken) und würde ein sichere Kommunikation zwischen Client und Server erfordert, sowie die Akzeptanz der Risiken im Zusammenhang mit dem un-Hash-Passwort zu übertragen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top