Máy đo độ mạnh mật khẩu [đã đóng]


79

Tôi có một tình huống mà tôi muốn có thể xếp hạng mật khẩu người dùng trong giao diện web với hệ thống của mình, để trước khi nhấn gửi, họ biết liệu họ có mật khẩu xấu hay không.

Yêu cầu chính:

  • Phải có khả năng đánh giá mật khẩu, không chỉ đạt / không đạt.
  • Nên vô hiệu hóa biểu mẫu nếu mật khẩu nằm dưới một ngăn, vì vậy người dùng không thể gửi nó.
  • Nhìn đẹp. :)
  • Không sử dụng jQuery - chúng tôi hiện đang sử dụng Mochikit và Y! UI trong hệ thống này.

Tôi đã tìm thấy nhiều công cụ đo mật khẩu được viết bằng jQuery và những thứ như http://www.passwordmeter.com/ quá dài dòng.

Bất cứ ai có thể đề xuất cách giảm mật khẩu javascript tốt mà tôi có thể sử dụng hoặc cho một ví dụ về cách viết mật khẩu?



1
Đây là cách keepass thực hiện nó trong C # github.com/dlech/KeePass2.x/blob/…
nu everest.

5
"Đóng cửa là không xây dựng"? Tôi thấy điều này thực sự rất có tính xây dựng. Xem 58,000+ lần, rank top Google, vv Thôi thôi ...
3Dom

Nếu bạn sử dụng máy đo độ mạnh mật khẩu, hãy đảm bảo kiểm tra nó bằng cách kiểm tra độ tỉnh táo cơ bản. V4cc!nat!0n#3là một mật khẩu yếu khủng khiếp (bị bẻ khóa chưa đầy một giờ) , trong khi lại monitor coke cursor fatrất mạnh (bị bẻ khóa trong 146.000 thế kỷ). Hãy chắc chắn rằng các kiểm tra mật khẩu mà bạn sử dụng là cho kết quả hợp lệ (tức là yêu cầu phức tạp làm cho mật khẩu yếu, không mạnh hơn)
Ian Boyd

Câu trả lời:


14

Đây là bộ sưu tập các tập lệnh: http://webtecker.com/2008/03/26/collection-of-password-strength-scripts/

Tôi nghĩ rằng cả hai đều đánh giá mật khẩu và không sử dụng jQuery ... nhưng tôi không biết liệu họ có hỗ trợ gốc để tắt biểu mẫu không?


3
Hãy nhớ rằng, ngay cả khi bạn vô hiệu hóa biểu mẫu trong javascript, bạn cũng nên chạy kiểm tra này ở phía máy chủ. Người dùng khó tính sẽ chỉ gửi biểu mẫu, hoặc điều gì sẽ xảy ra nếu người dùng đã tắt javascript?
Chris K

2
Bạn cũng cần lưu ý rằng người dùng chỉ đang tự lừa mình . Không chắc bạn có cần bảo vệ người dùng khỏi điều đó ...
caw

8
Tôi nghĩ rằng trang bạn liên kết đã bị tấn công ... LOL! điều trớ trêu
KnF

230

Cập nhật : đã tạo js fiddle tại đây để xem trực tiếp: http://jsfiddle.net/HFMvX/

Tôi đã tìm kiếm trên google và không tìm thấy bất cứ điều gì thỏa mãn. tôi thích cách passpack đã làm điều đó về cơ bản đã được thiết kế ngược phương pháp tiếp cận của họ, chúng ta bắt đầu:

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

Mật khẩu tốt bắt đầu đạt điểm khoảng 60 hoặc lâu hơn, đây là chức năng để dịch điều đó thành lời:

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

    return "";
}

bạn có thể muốn điều chỉnh điều này một chút nhưng tôi thấy nó phù hợp với tôi


19
+1 vì phương pháp này đánh giá mật khẩu giống như cách zxcvbn làm, nhưng với mã ít hơn nhiều: qwER43@!=> điểm 70 = tốt, Tr0ub4dour&3=> điểm 80 = mạnh, correcthorsebatterystaple=> điểm 86 = mạnh.
Julien Kronegg

1
Tôi đã viết lại hàm này bằng PHP để kiểm tra điểm trên máy chủ nữa: pastie.org/8889985
MacroMan Ngày

3
Nhìn vào grc.com/haystack.htm được chỉ ra bởi @Ziggy và thử nghiệm điểm yếu lớn của giải pháp này là nó nói rằng mật khẩu có độ dài dưới 8 là yếu hoặc tốt khi chúng quá nhỏ. Thêm phần sau vào đầu bổ sung checkPassStrength(pass)điểm yếu if( pass.length < 8 ) { return "poor"; }khuyến khích mọi người sử dụng thứ gì đó đủ lâu với các ký tự hỗn hợp sẽ yếu, tốt hoặc mạnh tùy thuộc vào thời lượng. bất cứ điều gì ít hơn là thực sự nghèo.
simbo1905

1
Đây chỉ là đoạn mã tôi đang tìm kiếm. Các đoạn mã như thế này trợ giúp khi bạn đã hoàn thành thiết kế và chỉ đang tìm kiếm một plugin thuật toán .. Chỉnh sửa: Bạn vừa phát hiện ra rằng bạn không thể sử dụng cả chữ in đậm và in nghiêng cho cùng một văn bản trong khi bình luận!
mccbala

8
vấn đề nhỏ: điều này abcdefghijklmnopqrstuvwxyzđạt điểm 130. nó sẽ kiểm tra các mẫu, v.v. mà hacker sẽ nghĩ ra.
Yaakov Ainspan

37
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

Cài đặt Chuyển thành true hoặc false, nếu bạn muốn thay đổi những gì được kiểm tra trong mật khẩu

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

Bạn có thể tùy chỉnh bởi chính mình theo yêu cầu của bạn.


3
@garrow: Có gì sai với phong cách viết mã không phải là khác với phong cách của bạn? (FTR, nó không phải là phong cách tôi thích cả hai, nhưng vì vậy những gì?)
Lawrence Dol

2
chuyện gì đã xảy ra với "2 số"? :)
Nicholas Shanks

19
Hãy thử một trường hợp thử nghiệm! Mật khẩu của Bill là "123 & $ aA", khoảng 40 bit entropy theo wikipedia. Thuật toán của bạn cho điểm 80. Mật khẩu của Alice là "eriahrieudfklsvhnsreuilvnreuhgsldhhvf", khoảng 160 bit hoặc entropy. Thuật toán của bạn xếp hạng nó là 35. Nói rõ ràng, việc cắm hai mật khẩu đó vào grc.com/haystack.htm cho chúng ta 0,7 giây để bẻ khóa so với 74,72 nghìn tỷ nghìn tỷ thế kỷ.
Ziggy

13
Nghiêm túc mặc dù. Bạn không hề lo lắng rằng câu trả lời được bình chọn nhiều lần của bạn sẽ đề xuất mật khẩu yếu hơn mật khẩu mạnh hơn? Mọi người sẽ sao chép, dán cái này!
Ziggy

3
Tất cả các tùy chọn khác đều tuyệt vời, nhưng yếu tố số một quyết định độ mạnh của mật khẩu là độ dài . Điều này cần được phản ánh trong điểm số. Dù sao thì tôi nghĩ mọi người có thể dễ dàng tùy chỉnh điều này.
Stijn de Witt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.