Passwortstärkemessgerät [geschlossen]

77

Ich habe eine Situation, in der ich ein Benutzerkennwort in der Weboberfläche meines Systems bewerten möchte, damit sie wissen, ob sie ein falsches Kennwort haben, bevor sie auf Senden klicken.

Schlüsselanforderungen:

  • Muss in der Lage sein, das Passwort zu bewerten, nicht nur bestanden / nicht bestanden.
  • Sollte das Formular deaktivieren, wenn das Kennwort unter einem Schwellenwert liegt, kann der Benutzer es nicht senden.
  • Schön aussehen. :) :)
  • Verwenden Sie jQuery nicht - wir verwenden derzeit Mochikit und Y! UI in diesem System.

Ich habe viele in jQuery geschriebene Passwortanzeigen gefunden und Dinge wie http://www.passwordmeter.com/ , die zu ausführlich sind.

Kann jemand einen guten Drop-in-Javascript-Passwort-Rater vorschlagen, den ich verwenden kann, oder ein Beispiel geben, wie man einen schreibt?

Jerub
quelle
8
Werfen
1
So macht es keepass in C # github.com/dlech/KeePass2.x/blob/…
nu everest
5
"Geschlossen als nicht konstruktiv"? Ich fand das sehr konstruktiv. Mehr als 58.000 Mal angesehen, Top-Google-Rang usw. Komm schon Leute ...
3Dom
Wenn Sie ein Kennwortstärkemessgerät verwenden, stellen Sie sicher, dass Sie es mit einer grundlegenden Überprüfung der Integrität testen. V4cc!nat!0n#3ist ein schrecklich schwaches Passwort (weniger als eine Stunde geknackt) , während monitor coke cursor fates außerordentlich stark ist (in 146.000 Jahrhunderten geknackt). Stellen Sie sicher, dass die von Ihnen verwendete Passwortprüfung gültige Ergebnisse liefert (dh Komplexitätsanforderungen machen Passwörter schwächer, nicht stärker)
Ian Boyd

Antworten:

13

Hier ist eine Sammlung von Skripten: http://webtecker.com/2008/03/26/collection-of-password-strength-scripts/

Ich denke, beide bewerten das Passwort und verwenden jQuery nicht ... aber ich weiß nicht, ob sie native Unterstützung für das Deaktivieren des Formulars haben?

Kanamekun
quelle
3
Denken Sie daran, auch wenn Sie das Formular in Javascript deaktivieren, sollten Sie diese Prüfung auch auf der Serverseite ausführen. Tricksy-Benutzer senden ohnehin nur Formulare, oder was ist, wenn ein Benutzer Javascript deaktiviert hat?
Chris K
2
Sie sollten auch beachten, dass Benutzer nur sich selbst betrügen . Ich
bin
7
Ich denke, die Seite, die Sie verlinkt haben, wurde gehackt ... LOL! die Ironie
KnF
225

Update : hat hier eine js-Geige erstellt, um sie live zu sehen: http://jsfiddle.net/HFMvX/

Ich habe unzählige Google-Suchanfragen durchlaufen und nichts Befriedigendes gefunden. Ich mag es, wie Passpack es so grundlegend rückgängig gemacht hat, hier geht's:

function scorePassword(pass) {
    var score = 0;
    if (!pass)
        return score;

    // award every unique letter until 5 repetitions
    var letters = new Object();
    for (var i=0; i<pass.length; i++) {
        letters[pass[i]] = (letters[pass[i]] || 0) + 1;
        score += 5.0 / letters[pass[i]];
    }

    // bonus points for mixing it up
    var variations = {
        digits: /\d/.test(pass),
        lower: /[a-z]/.test(pass),
        upper: /[A-Z]/.test(pass),
        nonWords: /\W/.test(pass),
    }

    var variationCount = 0;
    for (var check in variations) {
        variationCount += (variations[check] == true) ? 1 : 0;
    }
    score += (variationCount - 1) * 10;

    return parseInt(score);
}

Gute Passwörter erreichen ungefähr 60 Punkte. Hier ist die Funktion, um dies in Worte zu fassen:

function checkPassStrength(pass) {
    var score = scorePassword(pass);
    if (score > 80)
        return "strong";
    if (score > 60)
        return "good";
    if (score >= 30)
        return "weak";

    return "";
}

Vielleicht möchtest du das ein bisschen stimmen, aber ich fand es gut für mich

tm_lv
quelle
18
+1, da diese Methode die Passwörter genauso bewertet wie zxcvbn , jedoch mit viel weniger Code: qwER43@!=> Punktzahl 70 = gut, Tr0ub4dour&3=> Punktzahl 80 = stark, correcthorsebatterystaple=> Punktzahl 86 = stark.
Julien Kronegg
1
Ich habe diese Funktion in PHP umgeschrieben, um die Punktzahl auch auf dem Server zu überprüfen
MacroMan
3
Ein Blick auf grc.com/haystack.htm , auf den @Ziggy hingewiesen hat, und das Experimentieren mit der großen Schwäche dieser Lösung zeigt, dass Passwörter mit einer Länge von weniger als 8 schwach oder gut sind, wenn sie viel zu klein sind. Fügen Sie das Folgende oben auf die checkPassStrength(pass)Stecker hinzu, um die Schwäche zu erkennen if( pass.length < 8 ) { return "poor"; }, die die Leute dazu ermutigt, etwas lange genug mit gemischten Zeichen zu verwenden, das je nach Länge schwach, gut oder stark sein wird. alles andere ist wirklich arm.
simbo1905
1
Dies ist nur der Ausschnitt, nach dem ich gesucht habe. Snippets wie diese helfen, wenn Sie bereits mit dem Design fertig sind und nur nach einem Algorithmus-Plugin suchen. Bearbeiten: Ich habe gerade herausgefunden, dass Sie beim Kommentieren nicht sowohl Fett als auch Kursiv für denselben Text verwenden können!
McCbala
7
kleines Problem: Dies abcdefghijklmnopqrstuvwxyzergibt eine Punktzahl von 130. Es sollte nach Mustern usw. suchen, an die ein Hacker denken würde.
Yaakov Ainspan
36
Password Strength Algorithm:

Password Length:
    5 Points: Less than 4 characters
    10 Points: 5 to 7 characters
    25 Points: 8 or more

Letters:
    0 Points: No letters
    10 Points: Letters are all lower case
    20 Points: Letters are upper case and lower case

Numbers:
    0 Points: No numbers
    10 Points: 1 number
    20 Points: 3 or more numbers

Characters:
    0 Points: No characters
    10 Points: 1 character
    25 Points: More than 1 character

Bonus:
    2 Points: Letters and numbers
    3 Points: Letters, numbers, and characters
    5 Points: Mixed case letters, numbers, and characters

Password Text Range:

    >= 90: Very Secure
    >= 80: Secure
    >= 70: Very Strong
    >= 60: Strong
    >= 50: Average
    >= 25: Weak
    >= 0: Very Weak

Einstellungen Schalten Sie auf wahr oder falsch um, wenn Sie ändern möchten, was im Kennwort aktiviert ist

var m_strUpperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var m_strLowerCase = "abcdefghijklmnopqrstuvwxyz";
var m_strNumber = "0123456789";
var m_strCharacters = "!@#$%^&*?_~"

Check password


function checkPassword(strPassword)
{
    // Reset combination count
    var nScore = 0;

    // Password length
    // -- Less than 4 characters
    if (strPassword.length < 5)
    {
        nScore += 5;
    }
    // -- 5 to 7 characters
    else if (strPassword.length > 4 && strPassword.length < 8)
    {
        nScore += 10;
    }
    // -- 8 or more
    else if (strPassword.length > 7)
    {
        nScore += 25;
    }

    // Letters
    var nUpperCount = countContain(strPassword, m_strUpperCase);
    var nLowerCount = countContain(strPassword, m_strLowerCase);
    var nLowerUpperCount = nUpperCount + nLowerCount;
    // -- Letters are all lower case
    if (nUpperCount == 0 && nLowerCount != 0) 
    { 
        nScore += 10; 
    }
    // -- Letters are upper case and lower case
    else if (nUpperCount != 0 && nLowerCount != 0) 
    { 
        nScore += 20; 
    }

    // Numbers
    var nNumberCount = countContain(strPassword, m_strNumber);
    // -- 1 number
    if (nNumberCount == 1)
    {
        nScore += 10;
    }
    // -- 3 or more numbers
    if (nNumberCount >= 3)
    {
        nScore += 20;
    }

    // Characters
    var nCharacterCount = countContain(strPassword, m_strCharacters);
    // -- 1 character
    if (nCharacterCount == 1)
    {
        nScore += 10;
    }   
    // -- More than 1 character
    if (nCharacterCount > 1)
    {
        nScore += 25;
    }

    // Bonus
    // -- Letters and numbers
    if (nNumberCount != 0 && nLowerUpperCount != 0)
    {
        nScore += 2;
    }
    // -- Letters, numbers, and characters
    if (nNumberCount != 0 && nLowerUpperCount != 0 && nCharacterCount != 0)
    {
        nScore += 3;
    }
    // -- Mixed case letters, numbers, and characters
    if (nNumberCount != 0 && nUpperCount != 0 && nLowerCount != 0 && nCharacterCount != 0)
    {
        nScore += 5;
    }


    return nScore;
}

// Runs password through check and then updates GUI 


function runPassword(strPassword, strFieldID) 
{
    // Check password
    var nScore = checkPassword(strPassword);


     // Get controls
        var ctlBar = document.getElementById(strFieldID + "_bar"); 
        var ctlText = document.getElementById(strFieldID + "_text");
        if (!ctlBar || !ctlText)
            return;

        // Set new width
        ctlBar.style.width = (nScore*1.25>100)?100:nScore*1.25 + "%";

    // Color and text
    // -- Very Secure
    /*if (nScore >= 90)
    {
        var strText = "Very Secure";
        var strColor = "#0ca908";
    }
    // -- Secure
    else if (nScore >= 80)
    {
        var strText = "Secure";
        vstrColor = "#7ff67c";
    }
    // -- Very Strong
    else 
    */
    if (nScore >= 80)
    {
        var strText = "Very Strong";
        var strColor = "#008000";
    }
    // -- Strong
    else if (nScore >= 60)
    {
        var strText = "Strong";
        var strColor = "#006000";
    }
    // -- Average
    else if (nScore >= 40)
    {
        var strText = "Average";
        var strColor = "#e3cb00";
    }
    // -- Weak
    else if (nScore >= 20)
    {
        var strText = "Weak";
        var strColor = "#Fe3d1a";
    }
    // -- Very Weak
    else
    {
        var strText = "Very Weak";
        var strColor = "#e71a1a";
    }

    if(strPassword.length == 0)
    {
    ctlBar.style.backgroundColor = "";
    ctlText.innerHTML =  "";
    }
else
    {
    ctlBar.style.backgroundColor = strColor;
    ctlText.innerHTML =  strText;
}
}

// Checks a string for a list of characters
function countContain(strPassword, strCheck)
{ 
    // Declare variables
    var nCount = 0;

    for (i = 0; i < strPassword.length; i++) 
    {
        if (strCheck.indexOf(strPassword.charAt(i)) > -1) 
        { 
                nCount++;
        } 
    } 

    return nCount; 
} 

Sie können selbst nach Ihren Wünschen anpassen.

Shashi
quelle
3
@garrow: Was ist falsch an dem Codierungsstil, außer dass er sich von deinem unterscheidet? (FTR, es ist auch nicht der Stil, den ich bevorzuge, aber was nun?)
Lawrence Dol
2
Was ist mit "2 Zahlen" passiert? :)
Nicholas Shanks
19
Versuchen wir einen Testfall! Bills Passwort lautet "123 & $ aA", laut Wikipedia etwa 40 Bit Entropie. Ihr Algorithmus gibt eine Punktzahl von 80. Alices Passwort lautet "eriahrieudfklsvhnsreuilvnreuhgsldhhvf", ungefähr 160 Bit oder Entropie. Ihr Algorithmus hat den 35. Rang. Um ganz klar zu sein: Wenn Sie diese beiden Passwörter in grc.com/haystack.htm einfügen, haben wir 0,7 Sekunden Zeit, um 74,72 Billionen Billionen Jahrhunderte zu knacken.
Ziggy
13
Aber im Ernst. Sie sind überhaupt nicht besorgt darüber, dass Ihre mehrfach hochgestimmte Antwort schwächere Passwörter gegenüber stärkeren vorschlägt? Die Leute werden kopieren und einfügen!
Ziggy
3
Alle anderen Optionen sind großartig, aber der wichtigste Faktor für die Kennwortstärke ist die Länge . Dies sollte sich in der Partitur widerspiegeln. Wie auch immer, ich denke, es ist einfach für die Leute, dies anzupassen.
Stijn de Witt