密码强度计

Jer*_*rub 63 javascript passwords

我有一种情况,我希望能够在网络界面中将用户密码评级到我的系统,以便在他们点击提交之前知道他们是否有错密码.

关键要求:

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

我发现很多用jQuery编写的密码计,像http://www.passwordmeter.com/这样的东西太冗长了.

任何人都可以建议我可以使用javascript密码评估器,或举例说明如何写一个?

tm_*_*_lv 191

更新:在这里创建了一个js小提琴来观看它:http://jsfiddle.net/HFMvX/

我经历了大量的谷歌搜索,并没有找到满意的东西.我喜欢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),
    }

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

    return parseInt(score);
}
Run Code Online (Sandbox Code Playgroud)

好的密码开始得分大约60左右,这里的功能是用语言翻译:

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

    return "";
}
Run Code Online (Sandbox Code Playgroud)

你可能想稍微调整一下,但我发现它很适合我

  • +1因为这种方法以相同的方式对密码进行评级[zxcvbn](https://tech.dropbox.com/2012/04/zxcvbn-realistic-password-strength-estimation/),但代码少得多:`qwER43 @!`=>得分70 =好,`Tr0ub4dour&3` =>得分80 =强,`correcthorsebatterystaple` =>得分86 =强. (15认同)
  • 小问题:这个'abcdefghijklmnopqrstuvwxyz`获得130分.它应该检查黑客会想到的模式等. (5认同)
  • 看看@Ziggy指出的https://www.grc.com/haystack.htm并试验这个解决方案的一大弱点就是它说长度小于8的密码在它们太小的时候是弱的还是好的.将以下内容添加到`checkPassStrength(pass)的顶部`插入弱点`if(pass.length <8){return"poor"; 鼓励人们长时间使用混合字符的东西,这些字符会变弱,变好或变强,具体取决于它的长度.更少的东西真的很穷. (3认同)

Sha*_*shi 35

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
Run Code Online (Sandbox Code Playgroud)

设置如果要更改密码中选中的内容,请切换为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; 
} 
Run Code Online (Sandbox Code Playgroud)

您可以根据自己的要求自行定制.

  • 我们来试试吧!根据维基百科,比尔的密码是"123&$ aA",约为40比特的熵.你的算法得分为80. Alice的密码是"eriahrieudfklsvhnsreuilvnreuhgsldhhvf",大约160位或熵.你的算法将它排在第35位.为了清楚起见,将这两个密码插入https://www.grc.com/haystack.htm会让我们破解0.7秒,而74.72万亿亿个世纪. (14认同)
  • 说真的.您并不担心您的多次上调答案会建议较弱的密码而不是较强的密码?人们会复制粘贴这个! (9认同)
  • @garrow:除了与你的不同之外,编码风格有什么问题?(FTR,它不是我喜欢的风格,但那又怎么样?) (3认同)
  • 所有其他选项都很棒,但确定密码强度的首要因素是**长度**.这应该反映在分数中.无论如何,我认为人们很容易定制这个. (3认同)
  • "2号码"发生了什么?:) (2认同)

kan*_*kun 13

以下是一系列脚本:http: //webtecker.com/2008/03/26/collection-of-password-strength-scripts/

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

  • 我认为您链接的页面被黑了......哈哈!具有讽刺意味的 (5认同)
  • 请记住,即使您在javascript中禁用表单,也应该在服务器端运行此检查.Tricksy用户无论如何都会做表单提交,或者如果用户禁用了javascript怎么办? (3认同)
  • 您还应该注意,用户只是在欺骗*他们自己*。不确定您是否需要保护用户免受... (3认同)