Вимірювач сили пароля [закрито]


79

У мене ситуація, коли я хотів би мати можливість оцінювати пароль користувача у веб-інтерфейсі до моєї системи, щоб перед тим, як натиснути кнопку "подати", вони знали, чи має вони поганий пароль.

Основні вимоги:

  • Повинен мати можливість оцінювати пароль, а не просто передавати / пропускати.
  • Повинен відключити форму, якщо пароль знаходиться нижче порогу, тому користувач не може його подати.
  • Маєте гарний вигляд. :)
  • Не використовуйте jQuery - зараз ми використовуємо Mochikit та Y! UI в цій системі.

Я знайшов багато вимірювачів паролів, написаних у jQuery, і такі речі, як http://www.passwordmeter.com/ , занадто багатослівні.

Хто-небудь може запропонувати хорошу падіння рейтингу паролів javascript, яким я можу скористатися, або навести приклад, як писати такий?


9
Погляньте на github.com/dropbox/zxcvbn
— jcuenod

1
Ось як keepass робить це на C # github.com/dlech/KeePass2.x/blob/…
— nu everest

5
"Закрито як не конструктивне"? Я вважав це дуже конструктивним. Переглядали 58 000+ разів, найвищий рейтинг у Google тощо. Давайте, люди ...
— 3Dom

Якщо ви все-таки використовуєте вимірювач надійності пароля, не забудьте протестувати його за допомогою базової перевірки розумності. V4cc!nat!0n#3є жахливо слабким паролем (зламаний менше години) , а monitor coke cursor fatнадзвичайно міцним (зламаний за 146 000 століть). Переконайтеся, що програма перевірки паролів дає достовірні результати (тобто вимоги до складності роблять паролі слабшими, а не сильнішими)
— Ян Бойд,

Відповіді:


14

Ось колекція сценаріїв: http://webtecker.com/2008/03/26/collection-of-password-strength-scripts/

Я думаю, що вони обидва оцінюють пароль і не використовують jQuery ... але я не знаю, чи є у них рідна підтримка для відключення форми?


3
Пам'ятайте, навіть якщо ви вимкнете форму у javascript, вам слід запустити цю перевірку і на стороні сервера. Хитрі користувачі в будь-якому випадку просто надсилатимуть форми, або що, якщо у користувача відключений javascript?
— Chris K

2
Слід також зазначити, що користувачі обманюють себе лише . Не впевнений, чи потрібно захищати користувачів від цього ...
— caw

8
Я думаю, що сторінку, на яку ви зв’язали, зламали ... ЛОЛ! іронія
— KnF

230

Оновлення : тут створено скрипту js, щоб побачити її у прямому ефірі: http://jsfiddle.net/HFMvX/

Я пройшов безліч пошуків у Google і не знайшов нічого, що задовольняло б. Мені подобається, як це зробив паспорт, настільки реконструюючи свій підхід.

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

Ви можете трохи налаштувати це, але я знайшов, що це добре для мене працює


19
+1, оскільки цей метод оцінює паролі так само, як це робить zxcvbn , але зі значно меншим кодом: qwER43@!=> оцінки 70 = добре, Tr0ub4dour&3=> оцінки 80 = сильні, correcthorsebatterystaple=> оцінки 86 = сильні.
— Julien Kronegg 06.03.13

1
Я переписав цю функцію в PHP для перевірки балів і на сервері: pastie.org/8889985
— MacroMan 07.03.14

3
Дивлячись на grc.com/haystack.htm, на який вказав @Ziggy, та експериментуючи, великою слабкістю цього рішення є те, що воно говорить, що паролі довжиною менше 8 є слабкими або хорошими, коли вони занадто малі. додаючи наступне до верхньої частини checkPassStrength(pass)штекерів, слабкість, if( pass.length < 8 ) { return "poor"; }яка спонукає людей використовувати щось досить довго зі змішаними персонажами, яке буде слабким, хорошим чи сильним, залежно від того, як довго це триває. все менше - справді бідне.
— simbo1905

1
Це лише той фрагмент, який я шукав. Такі фрагменти допомагають, коли ви вже закінчили з дизайном і просто шукаєте плагін для алгоритму .. Редагувати: Щойно з’ясувалося, що ви не можете використовувати як жирний, так і курсив для одного тексту під час коментування!
— mccbala

8
маленька проблема: це abcdefghijklmnopqrstuvwxyzотримує оцінку 130. вона повинна перевірити наявність зразків тощо, про які хакер міг би подумати.
— 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

Налаштування Переключіть на істинне або хибне, якщо ви хочете змінити те, що позначено в паролі

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, це теж не стиль, який я віддаю перевагу, але що?)
— Лоуренс Дол

2
що сталося з "2 числами"? :)
— Ніколас Шенкс

19
Спробуємо тест-кейс! Пароль Білла - "123 & $ aA", приблизно 40 біт ентропії згідно з wikipedia. Ваш алгоритм дає йому оцінку 80. Пароль Аліси - "eriahrieudfklsvhnsreuilvnreuhgsldhhvf", приблизно 160 біт або ентропія. Ваш алгоритм класифікує його як 35. Щоб бути зрозумілим, підключення цих двох паролів до grc.com/haystack.htm дає нам 0,7 секунди на злом проти 74,72 тисяч трильйонів трильйонів століть.
— Ziggy

13
Хоча серйозно. Ви зовсім не стурбовані тим, що ваша багаторазова відповідь на голосування буде пропонувати слабші паролі порівняно з міцнішими? Люди скопіюють вставте це!
— Ziggy

3
Усі інші варіанти чудові, але фактором номер один, що визначає надійність пароля, є довжина . Це повинно бути відображено в оцінці. У будь-якому випадку я думаю, що людям легко це налаштувати.
— Stijn de Witt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.