密码强度计[关闭]


77

我有一种情况,我希望能够在系统的Web界面中对用户密码进行评分,以便在用户单击“提交”之前知道他们是否输入了错误的密码。

关键要求:

  • 必须能够对密码进行评分,而不仅仅是通过/失败。
  • 如果密码低于阈值,则应禁用该表单,以便用户无法提交。
  • 看起来不错。:)
  • 不使用jQuery-我们目前在此系统中使用Mochikit和Y!UI。

我发现许多用jQuery编写的密码表,以及诸如http://www.passwordmeter.com/之类的太冗长的东西。

谁能建议我可以使用的javascript密码评分器下降很多,或举一个如何编写它的示例?




5
“封闭不建设性”?我发现这确实具有建设性。观看次数超过58,000次,在Google排名中居首位,等等。来吧……
3Dom 2015年

如果确实使用密码强度计,请确保通过基本的健全性检查对其进行测试。V4cc!nat!0n#3是一个非常脆弱的密码(不到一个小时破解),而monitor coke cursor fat却非常强大(在146,000个世纪内破解)。确保您使用的密码检查程序给出了有效的结果(即复杂性要求使密码更弱而不是更强)
Ian Boyd

Answers:


13

以下是脚本的集合:http : //webtecker.com/2008/03/26/collection-of-password-strength-scripts/

我认为他们俩都对密码进行了评分,并且不使用jQuery ...但我不知道他们是否对禁用表单有本地支持?


3
请记住,即使您禁用了javascript中的表单,也应该在服务器端运行此检查。Tricksy用户无论如何都会提交表单,或者如果用户禁用了javascript怎么办?
克里斯K

2
您还应该注意,用户只是在欺骗自己。不确定是否需要保护用户免受此侵害...
caw

7
我认为您链接的页面被黑了……大声笑!具有讽刺意味的是
KnF

225

更新:在此处创建了一个js小提琴以进行实时观看:http//jsfiddle.net/HFMvX/

我经历了无数的Google搜索,没有找到令人满意的结果。我喜欢passpack如何做到这一点,因此基本上对他们的方法进行了逆向工程,下面我们开始:

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);
}

好的密码的得分开始在60左右,这是将其翻译成文字的功能:

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

    return "";
}

您可能需要稍微调整一下,但是我发现它对我很有效


18
+1是因为此方法以与zxcvbn相同的方式对密码进行评分,但是使用更少的代码:qwER43@!=>得分70 =良好,Tr0ub4dour&3=>得分80 =强,correcthorsebatterystaple=>得分86 =强。
Julien Kronegg

1
我已经用PHP重写了此函数,以便也在服务器上检查分数:pastie.org/8889985
MacroMan 2014年

3
查看@Ziggy指出的grc.com/haystack.htm并尝试该解决方案的最大弱点是,它说长度小于8的密码太小或太弱。在checkPassStrength(pass)插件的顶部添加以下内容,以if( pass.length < 8 ) { return "poor"; }鼓励人们使用足够长的东西和混杂的字符,这取决于它的长短,它是弱的,好还是强的。没有什么是真正的贫穷。
simbo1905 2015年

1
这只是我想要的片段。当您已经完成设计并且只是在寻找算法插件时,像这样的代码片段会有所帮助。编辑:刚刚发现您不能在评论时对同一文本使用粗体和斜体!
mccbala 2015年

7
小问题:这个abcdefghijklmnopqrstuvwxyz分数为130。它应该检查黑客会想到的模式等。
Yaakov Ainspan '16

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

如果要更改密码中选中的内容,则设置切换为true或false

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; 
} 

您可以根据自己的需要进行自定义。


3
@garrow:除了与您的风格不同之外,编码风格还有什么问题?(FTR,它也不是我喜欢的风格,但是那又怎样?)
Lawrence Dol

2
“ 2个数字”怎么了?:)
Nicholas Shanks

19
让我们尝试一个测试用例!比尔的密码是“ 123&$ aA”,根据维基百科,熵大约为40位。您的算法得分为80。爱丽丝的密码为“ eriahrieudfklsvhnsreuilvnreuhgsldhhvf”,大约160位或熵。您的算法将其排名为35。需要明确的是,将这两个密码插入grc.com/haystack.htm,相对于74,720万亿亿世纪以来,我们的破解时间为0.7秒。
Ziggy 2014年

13
认真地。您根本不担心您多次投票的答案会建议使用较弱的密码而不是较强的密码吗?人们会复制粘贴!
Ziggy 2014年

3
所有其他选项都不错,但是决定密码强度的首要因素是长度。这应该反映在分数中。无论如何,我认为人们可以很容易地对此进行自定义。
Stijn de Witt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.