Подтвердить что ты не робот

Как рассчитать сложность пароля

Некоторые приложения (или веб-сайты) вычисляют сложность пароля при вводе.

Обычно они отображают красную полосу, которая становится оранжевой, затем зеленой, а затем еще более зеленой по мере того, как пароль становится длиннее, и содержит больше классов символов (например, строчные, прописные, знаки пунктуации, цифры).

Как я могу надежно рассчитать сложность пароля?

Я придумал следующий алгоритм, но меня беспокоит тот факт, что он оценивает Password1! как "очень сильный" и ]@feé:m как "слабый", потому что длина его всего 7 символов.

private int GetPasswordComplexity(string password)
{
    if (password.Length <= 4)
        return 1;

    int complexity = 0;

    int digit = 0;
    int letter = 0;
    int cap = 0;
    int other = 0;

    for (int i = 0; i < password.Length; i++)
    {
            if (char.IsDigit(password[i]) && i!=password.Length-1)
            digit = 1;
        else if (char.IsLower(password[i]))
            letter = 1;
        else if (char.IsUpper(password[i]) && i!=0)
            cap = 1;
        else
            other = 1;
    }

    complexity = digit + letter + cap + other;

    if (password.Length <= 7)
        complexity = Math.Min(3, complexity);

    return complexity;
}
4b9b3361

Ответ 1

Использование что-то вроде cracklib очень хорошо, если вы можете позволить себе время проверки всех потенциальных правил. Если вы просто хотите что-то быстрое - скажем, для измерителя силы на основе JavaScript, - подумайте об оценке числа потенциальных догадок, которые потребуются для атаки методом перебора. Для каждого увиденного типа символов обновите множитель на основе количества потенциальных символов этого типа. Таким образом, если у вас есть только цифры, то множитель будет 10. Если у вас только строчные буквы, то множитель равен 26. Если и то и другое, то множитель равен 36 - то есть для каждого символа в пароле атака методом перебора нужно попробовать до 36 разных персонажей. Пароль, содержащий прописные и строчные буквы, цифры и знаки препинания, будет иметь множитель 10 + 26 + 26 + 32 = 94 (более или менее в зависимости от допустимой пунктуации).

Чтобы оценить максимальное количество перестановок, которое может занять метод перебора, увеличьте множитель до степени, равной количеству цифр в пароле. Это дает вам максимальное количество предположений, которое потребуется, чтобы взломать пароль с помощью атаки методом грубой силы. Предположим, что каждое предположение занимает один цикл процессора, и, учитывая, что самый быстрый процессор вычисляет, сколько времени потребуется, чтобы взломать пароль, учитывая определенное количество перестановок. Например, если бы мой множитель был 10, а пароль длиной 10 символов, то у меня было бы 10 000 000 000 потенциальных комбинаций. На процессоре 3GHz это должно занять 10/3 * k или 3k секунд (где k - количество циклов на предположение, обычно небольшое). Понятно, что это слабый пароль.

Теперь установите несколько диапазонов, которые представляют разумную надежность пароля. Например, если вы считаете, что 8-символьный пароль с заглавными и строчными буквами минимально необходим для средней надежности, тогда ваш предел будет 52 ^ 8 или примерно 1,5 года на процессоре 3 ГГц (при условии, что k = 1). Если вы добавите цифры, то для процессора с частотой 3 ГГц значение отсечки становится равным 62 ^ 8 или примерно 8 лет.

Чтобы использовать его, вам нужно только отслеживать, какие символы вы видите, построить соответствующий множитель, рассчитать ожидаемые перестановки на основе длины пароля и сравнить его с вашими предопределенными отсечками, чтобы определить, насколько надежным является пароль.

Ответ 2

Я бы рекомендовал использовать cracklib для этого.

Ответ 3

Я бы не просто устанавливал флаг, когда вы видите цифру, капитал и т.д., но указываете на них очки. Что-то вроде системы баллов. Обычная буква подсчитывает 1, цифру 2 и специальный символ 3.

Теперь ваше общее количество учитывает как количество символов, так и пароль. Вам нужно только рисовать линии для слабого и сильного.

Ответ 4

Вы также должны проверить на словарь. Я думаю, что яблоко делает это в своем встроенном пароле.

Ответ 5

Я написал небольшое приложение Javascript (GPL). Посмотрите: Еще один измеритель пароля. Вы можете загрузить исходный код и использовать/изменить его под GPL.

Ответ 6

Эта ссылка делает именно это, с подробным объяснением используемых критериев!