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


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.