Всіх вітаю! У цій статті ми будемо перевіряти безпеку паролів за допомогою бібліотеки zxcvbn, яка визначає надійність пароля та допомагає поліпшити його.
Встановлення бібліотеки
Windows:
pip install zxcvbnMacOS:
pip3 install zxcvbnLinux:
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': []}}У якості результату отримали словник із по-справжньому багатим вмістом, який показує нам різні аспекти надійності пароля. Нижче я привів означення кожного ключа для глибшого розуміння.
Ключ | Сенс |
|---|---|
| Пароль, який ми передали функції. |
| Кількість спроб, щоб вгадати пароль. |
| Переводить число кількості спроб у ключі |
| Це якби тип шаблону пароля. У даному випадку там написано |
| Це частина нашого пароля, який відповідає шаблону. |
| Під час перевірки пароля програма перевіряє пароль, визначаючи його шаблон за окремими частинами якраз завдяки цим індексам. Ключ Наприклад, якщо наш пароль буде містити ім’я та рік народження, то програма за допомогою цих індексів зрозуміє, що перша частина є ім’ям (за шаблоном), а друга — роком народження (це буде вже інший шаблон). |
| Час, за який наш процесор виконав функцію |
| Оцінка надійності пароля. Пароль оцінюється від 0 до 4. Тобто у даному випадку, наш пароль є максимально безпечним. |
| Тут ми можемо побачити застереженя щодо надійності пароля ( |
Окремо про ключі 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.']}}Як бачимо, усі аспекти пароля чітко дають нам розуміння, що він ненадійний. Крім того, ми можемо побачити деякі нові ключі у словнику, які теж мають своє значення.
Сенс нових ключів можна побачити у нижче у таблиці.
Ключ | Сенс |
|---|---|
| Це слово зі словника, яке підходить до нашого пароля. |
| Місце, яке займає даний пароль у списку популярних паролів. |
| Показує назву словника, у якому безпосередньо й був знайдений пароль. |
| Перевіряє, чи написаний пароль задом на перед. |
| Перевіряє, чи не немає у паролі замін літери на цифру або символ. Таке часто можна побачити у різних паролях. Наприклад, замість |
| Базова кількість спроб, за які можна вгадати пароль, якби б воно не містило жодних змін. |
| Визначає рівень складності пароля, якщо б він містив великі літери. |
| Визначає рівень складності пароля, якщо б він заміни літер на цифри або символи. |
Також варто пам’яти, що ми можемо просто обрати конкретні значення через ключі, а не виводити усю інформацію про пароль повністю.
Наприклад, тут ми виводимо рекомендації щодо поліпшення пароля:
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(), яка дозволяє повністю перевіряти паролі на пердмет їй надійності завдяки великому спектру можливих типів перевірок. Також ми порівняли висновки надійного та ненадійного паролів. Всім дякую за увагу!