Друкарня від WE.UA

Перевірка надійності пароля за допомогою бібліотеки zxcvbn

Всіх вітаю! У цій статті ми будемо перевіряти безпеку паролів за допомогою бібліотеки zxcvbn, яка визначає надійність пароля та допомагає поліпшити його.

Встановлення бібліотеки

Windows:

pip install zxcvbn

MacOS:

pip3 install zxcvbn

Linux:

pip install zxcvbn

Перевірка надійного пароля

Генерація пароля

Пропоную згенерувати випадковий пароль за допомогою модуля, якого ми розробляли ось у цій статті. Такиим чином, ось код для генерації випадкового пароля з 15 символів будь-якого типу (літери, цифри, спец. символи):

manager = Password()
password = manager.generate(15, "all")

print(password)

Отримуємо ось такий пароль:

2Ub!{V%kr=B(qhI

Перевірка надійності пароля

Отже, для отримання усіх даних про надійність пароля застосовується функція zxcvbn(), яка надає абсолютно усю інформацію про наш пароль.

Тепер передаємо функції zxcvbn() наш пароль і виводимо результат:

protection_report = zxcvbn.zxcvbn("2Ub!{V%kr=B(qhI")
print(protection_report)
{'password': '2Ub!{V%kr=B(qhI', 'guesses': Decimal('1000000000000001'), 'guesses_log10': 14.999999999999998, 'sequence': [{'pattern': 'bruteforce', 'token': '2Ub!{V%kr=B(qhI', 'i': 0, 'j': 14, 'guesses': 1000000000000000, 'guesses_log10': 14.999999999999998}], 'calc_time': datetime.timedelta(microseconds=2999), 'crack_times_seconds': {'online_throttling_100_per_hour': Decimal('36000000000000037.99840144433'), 'online_no_throttling_10_per_second': Decimal('100000000000000.1'), 'offline_slow_hashing_1e4_per_second': Decimal('100000000000.0001'), 'offline_fast_hashing_1e10_per_second': Decimal('100000.0000000001')}, 'crack_times_display': {'online_throttling_100_per_hour': 'centuries', 'online_no_throttling_10_per_second': 'centuries', 'offline_slow_hashing_1e4_per_second': 'centuries', 'offline_fast_hashing_1e10_per_second': '1 day'}, 'score': 4, 'feedback': {'warning': '', 'suggestions': []}}

У якості результату отримали словник із по-справжньому багатим вмістом, який показує нам різні аспекти надійності пароля. Нижче я привів означення кожного ключа для глибшого розуміння.

Ключ

Сенс

'password'

Пароль, який ми передали функції.

'guesses'

Кількість спроб, щоб вгадати пароль.

'guesses_log10'

Переводить число кількості спроб у ключі 'guesses' в більш зручний формат від 1 до 15.

'pattern'

Це якби тип шаблону пароля. У даному випадку там написано 'bruteforce', бо наш пароль є набором випадкових символів.

'token'

Це частина нашого пароля, який відповідає шаблону.

'i' та ‘j’

Під час перевірки пароля програма перевіряє пароль, визначаючи його шаблон за окремими частинами якраз завдяки цим індексам. Ключ ‘i’ — це початок, а ‘j’ — кінець.

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

'calc_time'

Час, за який наш процесор виконав функцію zxcvbn().

'score': 4

Оцінка надійності пароля. Пароль оцінюється від 0 до 4. Тобто у даному випадку, наш пароль є максимально безпечним.

'feedback': {'warning': '', 'suggestions': []}}

Тут ми можемо побачити застереженя щодо надійності пароля ('warning') та варіанти його поліпшення ('suggestions').

Окремо про ключі crack_times_seconds та crack_times_display

Ввважаю також за потрібне розписати в окремій частині статті дані ключі:

'crack_times_seconds': {'online_throttling_100_per_hour': Decimal('36000000000000037.99840144433'), 'online_no_throttling_10_per_second': Decimal('100000000000000.1'), 'offline_slow_hashing_1e4_per_second': Decimal('100000000000.0001'), 'offline_fast_hashing_1e10_per_second': Decimal('100000.0000000001')}, 'crack_times_display': {'online_throttling_100_per_hour': 'centuries', 'online_no_throttling_10_per_second': 'centuries', 'offline_slow_hashing_1e4_per_second': 'centuries', 'offline_fast_hashing_1e10_per_second': '1 day'},

Тут показані можливі типи атак для взламу пароля, і час, який витратить шахрай на кожен із цих типів. Ключ 'crack_times_seconds' показує цей час у секундах, а 'crack_times_display' — у більш звичному для нас форматі днів, місяців, років і т. д.

Пропоную розглянути контекст кожного з цих типів для кращого розуміння.

Перший тип ('online_throttling_100_per_hour') — це ситуація, у якій шахрай намагається підібрати ваш пароль через сайт (тобто онлайн), причому його ліміт складає 100 спроб на годину. Шахрай саме заходить на сайт, як і усі інші користувачі. Цей тип має обмеження, адже після декількох невдалих спроб сайт почне вмикати захист від ботів.

Другий тип ('online_no_throttling_10_per_second') — ситуація, у якій шахрай також підбирає пароль, але з лімітом у 10 спроб на секудну. Тут шахрай відсилає запити безпосередньо до сервера, тому обмежень вже менше.

Третій тип ('offline_slow_hashing_1e4_per_second') — ситуація, у якій шахрай має базу даних паролів (тобто ця атака вже проходить не онлайн), але паролі захищені надійним алгоритмом.

Четвертий тип ('offline_fast_hashing_1e10_per_second') — ситуація, у якій шахрай має базу даних паролів, але вони захещені ненадійним алгоритмом. І звісно, що тоді пароль буде легко взламаний, навіть якщо він у загальному є надійним.

Перевірка безпечності ненадійного пароля

Тепер давайте спробуємо застосувати функцію zxcvbn() до слабкого пароля, щоб побачити висновок про нього.

protection_report = zxcvbn.zxcvbn("qwerty")
print(protection_report)

Ось яку інформацію ми отримали про нього:

{'password': 'qwerty', 'guesses': Decimal('5'), 'guesses_log10': 0.6989700043360187, 'sequence': [{'pattern': 'dictionary', 'i': 0, 'j': 5, 'token': 'qwerty', 'matched_word': 'qwerty', 'rank': 4, 'dictionary_name': 'passwords', 'reversed': False, 'l33t': False, 'base_guesses': 4, 'uppercase_variations': 1, 'l33t_variations': 1, 'guesses': 4, 'guesses_log10': 0.6020599913279623}], 'calc_time': datetime.timedelta(microseconds=109428), 'crack_times_seconds': {'online_throttling_100_per_hour': Decimal('180.0000000000000099920072216'), 'online_no_throttling_10_per_second': Decimal('0.5'), 'offline_slow_hashing_1e4_per_second': Decimal('0.0005'), 'offline_fast_hashing_1e10_per_second': Decimal('5E-10')}, 'crack_times_display': {'online_throttling_100_per_hour': '3 minutes', 'online_no_throttling_10_per_second': 'less than a second', 'offline_slow_hashing_1e4_per_second': 'less than a second', 'offline_fast_hashing_1e10_per_second': 'less than a second'}, 'score': 0, 'feedback': {'warning': 'This is a top-10 common password.', 'suggestions': ['Add another word or two. Uncommon words are better.']}}

Як бачимо, усі аспекти пароля чітко дають нам розуміння, що він ненадійний. Крім того, ми можемо побачити деякі нові ключі у словнику, які теж мають своє значення.

Сенс нових ключів можна побачити у нижче у таблиці.

Ключ

Сенс

'matched_word'

Це слово зі словника, яке підходить до нашого пароля.

'rank'

Місце, яке займає даний пароль у списку популярних паролів.

'dictionary_name'

Показує назву словника, у якому безпосередньо й був знайдений пароль.

'reversed'

Перевіряє, чи написаний пароль задом на перед.

'l33t'

Перевіряє, чи не немає у паролі замін літери на цифру або символ. Таке часто можна побачити у різних паролях.

Наприклад, замість password може бути написано pa$$word.

'base_guesses'

Базова кількість спроб, за які можна вгадати пароль, якби б воно не містило жодних змін.

'uppercase_variations'

Визначає рівень складності пароля, якщо б він містив великі літери.

'l33t_variations'

Визначає рівень складності пароля, якщо б він заміни літер на цифри або символи.

Також варто пам’яти, що ми можемо просто обрати конкретні значення через ключі, а не виводити усю інформацію про пароль повністю.

Наприклад, тут ми виводимо рекомендації щодо поліпшення пароля:

protection_report = zxcvbn.zxcvbn("qwerty")
print(protection_report["feedback"])
{'warning': 'This is a top-10 common password.', 'suggestions': ['Add another word or two. Uncommon words are better.']}

Висновок

Отже, у цій статті ми розглянули бібліотеку zxcvbn(), яка дозволяє повністю перевіряти паролі на пердмет їй надійності завдяки великому спектру можливих типів перевірок. Також ми порівняли висновки надійного та ненадійного паролів. Всім дякую за увагу!

Статті про вітчизняний бізнес та цікавих людей:

Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Mystique Lord
Mystique Lord@nocturnal_reader we.ua/nocturnal_reader

Нічний читач

47Довгочити
510Прочитання
14Підписники
Підтримати
На Друкарні з 14 липня

Більше від автора

  • Методи title() та istitle() у Python

    Всіх вітаю! У цій статті ми розглянемо методи title() та istitle(), продовжуючи тему методів для рядків у Python.

    Теми цього довгочиту:

    Програмування
  • Різниця між методами isnumeric(), isdigit() та isdecimal() у Python

    Всіх вітаю! У даній статті ми поговоримо про методи визначення вмісту рядка за допомогою таких вбудованих методів як isnumeric(), isdigit() та isdecimal(). Також ми з’ясуємо різницю між цими трьома методами та як ними корисуватися.

    Теми цього довгочиту:

    Програмування
  • Створюємо надійний генератор паролів та визначаємо ентропію отриманого пароля

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

    Теми цього довгочиту:

    Програмування

Це також може зацікавити:

Коментарі (0)

Підтримайте автора першим.
Напишіть коментар!

Це також може зацікавити: