Время прочтения: 4 мин.

Пароль – это главный барьер, который мешает злоумышленникам получить ваши данные в сети. Чтобы не подвергать риску кражи данных, нужно создавать пароли, которые могут помешать хакерам.

Напомним, каким основным инструментарием владеют злоумышленники:

  • Перебор по словарю (автоматическая комбинация слов из словаря часто используемых словосочетаний)
  • Данные из социальной сети или любая другая информация, раскрытая вами (часто пользователи в качестве паролей выбирают различные комбинации имен, дат, кличек животных и т.д.)
  • Брутфорс-атака (автоматический перебор всех возможных комбинаций символов до тех пор, пока не найдется пароль)
  • и т.д.

Подробнее остановимся на последнем.

У брутфорс-алгоритмов вызывает трудности работа с длинными паролями, а вот короткие чаще всего можно подобрать за несколько часов!

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

Для работы программы нам понадобится библиотека re.

import re

Создаем функцию с двумя входными параметрами – паролем и печатью (необходимостью подробной печати по каждому из тестов_. Также изначально объявляем основную переменную результата – rs.

def password_stregth(pwd: str, prnt: bool):
    rs = 0
…

Пароль длины меньше 8 считается слабым (-10), обычный пароль имеет длину от 8 до 12 символов (+1), а хороший пароль имеет длину от 12 символов (+2).

…
    if len(pwd)<8:
        if prnt == True:
            print('Тест 1. Длина пароля:          маленькая    (-10)')
        rs -= 10
    elif len(pwd)<12:
        if prnt == True:
            print('Тест 1. Длина пароля:          обычная      (0)')
    
    else:
        if prnt == True:
            print('Тест 1. Длина пароля:          хорошая      (+1)')
        rs += 1
…

С помощью регулярных выражений мы можем проверить наличие в пароле строчных латинских букв – если они есть, то плюс 1 балл, если нет, то минус 1 балл.

…
    if not re.search(r'[a-z]', pwd):
        if prnt == True:
            print('Тест 2. Латиница (строчная):   отсутствует  (-1)')
        rs -= 1
    else:
        if prnt == True:
            print('Тест 2. Латиница (строчная):   присутствует (+1)')
        rs += 1
…

По аналогии с предыдущим фрагментом, делаем заглавную латиницу, строчную и заглавную кириллицу.

…    
     if not re.search(r'[A-Z]', pwd):
        if prnt == True:
            print('Тест 3. Латиница (заглавная):  отсутствует  (-1)')
        rs -= 1
    else:
        if prnt == True:
            print('Тест 3. Латиница (заглавная):  присутствует (+1)')
        rs += 1
    
    if not re.search(r'[а-яё]', pwd):
        if prnt == True:
            print('Тест 4. Кириллица (строчная):  отсутствует  (-1)')
        rs -= 1
    else:
        if prnt == True:
            print('Тест 4. Кириллица (строчная):  присутствует (+1)')
        rs += 1
    
    if not re.search(r'[А-ЯЁ]', pwd):
        if prnt == True:
            print('Тест 5. Кириллица (заглавная): отсутствует  (-1)')
        rs -= 1
    else:
        if prnt == True:
            print('Тест 5. Кириллица (заглавная): присутствует (+1)')
        rs += 1
…

Далее проверяем наличие в пароле цифр, оценивая их также – если есть, то плюс один балл, если нет, то минус один балл.

…
    if not re.search(r'\d', pwd):
        if prnt == True:
            print('Тест 6. Числа:                 отсутствуют  (-1)')
        rs -= 1
    else:
        if prnt == True:
            print('Тест 6. Числа:                 присутствуют (+1)')
        rs += 1
…

Теперь проверяем наличие в пароле специальных символов (сам набор спецсимволов можно расширить самостоятельно при необходимости).

…
    special = ['~', ':', "'", '+', '[', '\\', '@', '^', '{', '%', 
               '(', '-', '"', '*', '|', ',', '&', '<', '`', '}',
               '.', '_', '=', ']', '!', '>', ';', '?', '#', '$',
               ')', '/']
    if not any(char in special for char in pwd):
        if prnt == True:
            print('Тест 7. Специальные символы:   отсутствуют  (-1)')
        rs -= 1
    else:
        if prnt == True:
            print('Тест 7. Специальные символы:   присутствует (+1)')
        rs += 1
…

Также нам необходимо проверить количество уникальных символов, используемых в пароле.

…
    u_pwd = ''.join(set(pwd))
    if len(u_pwd) < 8:
        if prnt == True:
            print('Тест 8. Уникальность символов: плохая       (-1)')
        rs -= 1
    else:
        if prnt == True:
            print('Тест 8. Уникальность символов: хорошая      (+1)')
        rs += 1
…

Наконец, после всех вычислений, получаем итоговый результат.

…
    if rs < 1:
        print('Результат:', rs, '(Слабый пароль)')
    else:
        print('Результат:', rs, '(Надежный пароль)')

Посмотрим результат на паре примеров:

Следует помнить, что надежный пароль должен всегда отвечать «да» на следующий ряд вопросов:

  • Ваш пароль длинный?
  • В пароле используются разнообразные символы?

Также пароль можно улучшить неочевидными подстановками символов, избеганием простых последовательностей и т.д. Да, парой бывает, что пароль трудно запомнить, но что для вас важнее: небольшая трудность или свои данные?