✖

Безпека пароля

Зловмисник, який намагається потрапити в застосунок, захищений паролем (архів RAR із паролем, електронну пошту…), має кілька способів дістатися результату, не знаючи пароля. Одні вимагають певної дози кмітливості, винахідливості та знань, інші — трохи везіння і фізичної підготовки. Тож спершу підсумуймо, які є можливості в зловмисника.

Як зламати чийсь пароль

  • Знайти того, хто пароль знає (наприклад, власника пошти), і отримати пароль від нього — умовити, підкупити, побити. Цей спосіб я далі в статті не описуватиму :-).
  • Спробувати непомітно виманити пароль від власника, наприклад підробним листом. Фахово це називається фішинг (від англ. fishing — риболовля). Метод полягає в тому, що власнику акаунта надсилають лист із проханням відповісти й надіслати логін і пароль. Усе залежить від того, наскільки правдоподібно виглядатиме повідомлення, бо саме прохання навряд чи вистачить, треба додати якусь історію. Часто трапляється, що нібито зламалася база даних, і тому всіх користувачів просять ввести свій пароль і ім'я ще раз, інакше скриньку буде видалено тощо. Якщо повідомлення виглядає справді серйозно, відсоток успіху буває немалий.
  • Атака за словником — завантажуємо з інтернету добірки найпоширеніших паролів і перебираємо їх усі. Якщо пощастить і власник має якийсь поширений пароль, ми його справді легко дізнаємося. Звідси випливає той головний урок — не вигадуй паролів, які мають сенс. Постав собі, скажімо, пароль qwerty, і гарантую, що перший-ліпший початківець-хакер зламає його за кілька секунд. Це, мабуть, найефективніший метод: якщо маєш справді великий словник паролів, зможеш без особливих зусиль вгадати пароль значної частини користувачів.
  • Brute force — найпримітивніший метод, груба сила. Полягає в тому, що пробують усі можливі варіанти паролів, які тільки існують на світі. Програма поступово складає літери за певним алгоритмом і перевіряє, чи не влучила в потрібний пароль. Коли знаходить, зберігає його і завершується. Цей метод ми розглянемо далі.

Груба сила

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

Припустімо, що пароль має п'ять символів і складається лише з малих літер англійського алфавіту (без українських літер на кшталт ї чи є). Літер в англійському алфавіті двадцять шість. Тепер легко порахувати, скільки різних паролів можна скласти з п'яти таких літер. Використаємо розміщення, бо нам важливий порядок (пароль «lemon» не те саме, що «melon», хоча складається з тих самих літер), а також розміщення з повтореннями, бо літери в паролях можуть повторюватися. Переходимо до обчислення. Формула для розміщень з повтореннями виглядає так: $\overline{A}_n^k = n^k$. За n підставляємо кількість літер, з яких вибираємо, — кількість літер англійського алфавіту, а за k підставляємо кількість літер, з яких складається пароль, у нашому випадку п'ять. Отримуємо 265, а це приблизно дванадцять мільйонів різних розміщень. Це багато чи мало?

Це залежить і від того, яка в нас є машина. Якийсь старий комп'ютер здатен за секунду виконати небагато порівнянь, а надсучасні комп'ютери — у десять тисяч разів більше. У цих прикладах я працюватиму з тим, що комп'ютер виконує десять мільйонів порівнянь і оцінювань за секунду. Мабуть, уже всім зрозуміло, що п'ятизначний пароль такий комп'ютер виявив би менш ніж за дві секунди, а це справді невтішний результат. Але не здаватимемося.

Зміцнюємо пароль

П'ятизначний пароль анітрохи не безпечний, деякі розумніші системи такий короткий пароль навіть не дозволяють обрати. Кажуть, що пароль не має бути коротшим за вісім символів. Тепер підрахуймо, скільки існує розміщень для восьмизначного пароля. Як і в попередньому випадку, розглядатимемо лише малі літери англійського алфавіту. Підставляємо у формулу і отримуємо 268, а це приблизно двісті мільярдів розміщень. Це вже краще число. Комп'ютер оцінив би всі розміщення менш ніж за шість годин. Це краще, ніж минулого разу, але подивімося, наскільки зросла б міцність пароля, якби в паролі були ще й великі літери, цифри та спеціальні символи, як-от підкреслення, дефіси тощо.

Малих літер є 26, великих літер теж 26, разом це 52 символи. До цього ще треба додати 10 цифр і деякі спеціальні символи. Не скрізь дозволені всі спеціальні символи, тож для простоти я враховуватиму лише вісім спеціальних символів, щоб кількість символів округлилася до гарних 70. Довжина пароля знову вісім. Після підстановки виходить таке число: 708, а для наочності це приблизно 5{,}8 · 1014, словами — майже шістсот трильйонів розміщень. Це вже доволі поважне число. Наш комп'ютер перевірив би всі розміщення за шістнадцять тисяч годин! А це менш ніж два роки. Зловмисникові мало б дуже пощастити, щоб знайти пароль за якийсь реальний час. До того ж він мав би знати довжину твого пароля, бо інакше довелося б ще перевіряти розміщення з меншою кількістю літер.

Деякі люди так бояться за свої дані, що використовують цифрові паролі. Такі паролі дуже стійкі до атаки за словником, бо навряд чи в якомусь словнику часто вживаних паролів буде саме 41,274,390,553. На жаль, такі паролі хоч і стійкі до атаки за словником, але менш стійкі до brute force. Цифр є лише десять, тож кількість розміщень завжди 10k. Міцність пароля тримається лише на його довжині. Наш попередній восьмизначний пароль з усіма видами символів мав приблизно 5{,}8 · 1014 розміщень. Щоб досягти хоча б того самого з цифровим паролем, він мав би містити п'ятнадцять цифр, майже вдвічі більше символів. Чітко видно, що ефективніше обирати коротший пароль, але з більшою кількістю видів символів.

Не недооцінюй зловмисника

Зловмисник може бути кмітливим. Прочитавши попередні рядки, ти, скажімо, вирішуєш переписати свій нинішній пароль «limonada» хоча б на «Limonada», чим у кілька разів збільшиш кількість можливих розміщень, бо зловмисник тепер має врахувати в алгоритмі й великі літери. Але зловмисник може припустити, що велика літера буде лише на першому місці, бо так легше запам'ятати і не заведено, щоб велика літера була посеред слова. Тож він напише алгоритм, який перевірить усі розміщення слів із малими літерами і, можливо, з однією великою літерою одразу на початку.

Твій початковий пароль мав складність (тут я маю на увазі, скільки загалом могло бути розміщень, якби ми зберегли ту саму форму пароля — вісім малих літер) 268. Якби зловмисник не думав, новий пароль мав би складність 528, але якщо він використає описаний вище алгоритм, пароль матиме складність 52 · 267. На першому місці пароля можуть чергуватися малі та великі літери, їх разом 52, а на решті семи місць можуть чергуватися вже лише малі літери, і це стандартні розміщення з повтореннями.

Далі зловмисник може, наприклад, знати, що твій пароль складається з чотирьох літер і чотирьох цифр, не перемішаних: цифри завжди разом і літери завжди разом. Складність такого пароля обчислимо так: перша четвірка літер має разом 264 розміщень, друга четвірка цифр має 104 розміщень. Ці два результати помножимо: 264 · 104. Якби зловмисник не знав, чи першими йдуть цифри, чи літери, попередній результат довелося б ще помножити на два.