Хеш-функція

hash-function Освіта

Чи траплялося вам працювати з великими обсягами даних, де важливо швидко знаходити, перевіряти або захищати інформацію?

Саме тут на сцену виходить хеш-функція як інструмент компактного і надійного перетворення даних.

Хеш-функція – це алгоритм, який приймає вхідне значення довільної довжини та повертає фіксований за розміром хеш-код, що є унікальним відбитком цих даних.

У цій статті ми пояснимо, як працюють хеш-функції, де саме вони застосовуються – від структур даних до криптографії – та як уникати поширених помилок при їх використанні.

Визначення хеш-функції

Хеш-функція -мати всіх блокчейнів, хранителька паролів і просто цікава технологія.

Про хеш-функції мало говорять за межами вузького прошарку експертів з мережевої безпеки. А даремно. Без неї у нас не було б ні блокчейна, ні NFT, ні навіть електронних довідок у «Дії» – а вкрасти пароль з будь-якого сервісу було б справою кількох хвилин.

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

Що таке хеш-функція

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

Початковим повідомленням може бути що завгодно: рядок із пісні, код програми або, скажімо, роман «Ловець снів» Стівена Кінга китайською мовою. Неважливо, якої довжини буде вихідний текст, – на виході все одно вийде бітовий масив одного і того ж розміру. Наприклад, для функції SHA-1 це 160 біт, або рівно 40 символів.

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

Ключова властивість хеш-функції – незворотність. Не можна просто так узяти й розгорнути алгоритм назад і прочитати вихідне повідомлення. Тому, якщо хакеру до рук потрапить база даних із захешованими паролями, зламати він їх зможе тільки повним перебором – а на це може піти кілька місяців і навіть років.

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

Для чого потрібна хеш-функція

Хеш (hash) – це унікальний цифровий відбиток, який можна присвоїти будь-якому файлу: коду програми, музичному треку, науковій дисертації або банківській транзакції. Ключовий сенс – переконатися, що дані ніхто не зможе підмінити або підробити.

Один із популярних варіантів використання хеша – зберігання паролів на сайті. Коли ви заходите в особистий кабінет, ваші дані не передаються в базу даних у відкритому вигляді – інакше хакери давно вкрали б усі акаунти у світі.

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

Однак у хакерів і на цей випадок є хитрість. Оскільки один і той самий текст видає однаковий хеш, можна просто хешувати найпопулярніші паролі та підставляти їх під час злому. У Мережі можна знайти цілі словники, які містять тисячі колись злитих дехешованих паролів.

Щоб уникнути таких атак, кожному паролю під час реєстрації додають сіль – тобто випадковий набір символів. Коли ви вводите пароль, алгоритм додає до нього унікальну сіль, потім усе це діло хеширується і виходить абсолютно новий хеш. Навіть якщо ваш пароль – це банальний qwerty, parol або 12345, шахраї про це не дізнаються 🙂

Ще один приклад використання хешів – перевірка цілісності файлів. Наприклад, коли ви запускаєте гру зі Steam, лаунчер стежить, що все встановлено правильно, і жоден заповзятливий користувач не заліз у файли гри та не нашпигував їх під зав’язку різними модами і чітами.

Для цього розробники хешують ігрові файли – якщо їх змінити хоча б трохи, хеші не збігатимуться і клієнт Steam не дасть запустити гру.

Де використовується хеш-функція

Ось ще кілька сфер, де використовується хешування:

  • Блокчейн – щоб гарантувати справжність транзакцій. У кожен блок ланцюга додається хеш попередньої операції – якщо поміняти дані хоч трохи, хеші не збігатимуться і мережа не прийме зміни.
  • Цифрові підписи – щоб дистанційно підписувати документи без поїздок в офіси та зустрічей із кур’єрами.
  • Хеш-таблиці – це свого роду бази даних, де всі дані захищені від перезапису.
  • Антивіруси – зберігають віруси у вигляді так званого нечіткого хеша, який дає змогу шукати нові модифікації шкідливих програм.
  • Системи контролю версій (Git) – для перевірки цілісності об’єктів у репозиторії: файлів, коммітів, дерев тощо.

Як працює криптографічна хеш-функція

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

Хешувати будемо звичайну програмістську «рибу» – фразу «Hello, world!». Оскільки комп’ютер спілкується тільки мовою нулів і одиниць, насамперед алгоритм переведе текст у двійковий код.

Нюанс у тому, що хеш-функція оперує тільки блоками по 512 біт – а в нашій фразі тільки 104 біти. Тому доповнимо блок – почнемо з одиниці, а решту заповнимо нулями. У самому кінці блоку додамо двійковий код, що позначає розмір повідомлення в бітах, – у нас це 104, або 1101000.

Після цього алгоритм підготує основу для майбутнього хеша. За замовчуванням це п’ять констант по вісім символів – на виході якраз вийде фраза довжиною 40 символів і розміром 160 біт.

Виглядають константи так:

  • h0 = 0×67452301
  • h1 = 0xEFCDAB89
  • h2 = 0×98BADCFE
  • h3 = 0×10325476
  • h4 = 0xC3D2E1F0

А далі починається магія. Алгоритм дробить вихідне повідомлення на 80 шматочків і перемішує з кожною з констант. Кожна ітерація циклу оновлює значення h0-h4 доти, доки не закінчиться вихідне повідомлення. Поступово хеш виглядатиме все більш і більш випадковим.

Як цей цикл виглядає в псевдокоді, можна подивитися під спойлером.

Виконується функція в кілька раундів: один блок довжиною 512 біт – одна ітерація. Оскільки у фразі «Hello, world!» менше 512 біт, алгоритм опрацює її в один захід. Але навіть якби ми подали на вхід усі чотири томи «Війни і миру», хешування все одно зайняло б лише кілька секунд.

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

На виході отримуємо готовий хеш.

Безпека хеш-функції

В ідеалі хеш-функція має володіти такими властивостями:

  • Унікальність – два різних повідомлення не можуть видати однаковий хеш (насправді бувають винятки – про це пізніше).
  • «Лавинний ефект» – якщо у вихідних даних поміняти хоча б одну букву, вийде зовсім інший хеш.
  • Передбачуваність – для одного і того ж повідомлення завжди виходить однаковий хеш.
  • Незворотність – не можна просто так взяти і прочитати те, що захешовано.
  • Швидкість – щоб дані швидко оброблялися у високонавантажених системах.

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

Однак на практиці такого балансу досягти важко. Наприклад, якщо ми викручуємо швидкість, то одразу втрачаємо в надійності – з’являється ризик, що хтось прокрутить одразу багато раундів хеш-функції та розшифрує вихідне повідомлення. Навпаки, доказово безпечні хеш-функції, що ґрунтуються на складних математичних задачах, зазвичай доволі повільні та погано застосовні поза межами НДІ та держсектору.

Інша проблема – схильність до колізій. Це коли хеш-функція все-таки видає один і той самий хеш для двох різних повідомлень. У теорії це неминуче навіть для найпросунутіших алгоритмів – адже у нас є нескінченна кількість повідомлень на вході і строго фіксований рядок на виході.

Утім, найсучаснішим хеш-функціям ця проблема майже не загрожує. Наприклад, SHA-256, яка використовується в блокчейні, може видавати 2^256 варіантів хешів – це всього в 100 разів менше, ніж кількість атомів у космосі. Нарватися на колізію під час роботи з нею майже неможливо – про якийсь брутфорс і говорити не доводиться.

Якщо, звісно, у вас немає під рукою квантового комп’ютера (але навіть і це, за словами експертів, не гарантія успішного злому ?).

Коротко про головне

  • Криптографічна хеш-функція – це алгоритм, який приймає на вхід повідомлення і перетворює його на хеш, тобто бітовий масив фіксованого розміру. Наприклад, для SHA-1 це 160 біт, а для SHA-256 – 256 біт.
  • Для кожного повідомлення створюється свій унікальний хеш. Якщо поміняти у вхідних даних хоча б один символ, хеш зміниться до невпізнання.
  • Хеш можна присвоїти будь-якому файлу: тексту, пісні або комп’ютерній грі. Ключовий сенс – переконатися, що дані не можна змінити або підробити.
  • Результат роботи хеш-функції незворотній – алгоритм не можна запустити у зворотний бік і отримати вихідне повідомлення. Цим хешування відрізняється від шифрування, де, як правило, є ключ дешифрування.
  • Хешування використовується для різних завдань: для безпечного зберігання паролів на сайті, створення цифрових підписів, захисту ігрових даних, підтвердження транзакцій у блокчейні та багато чого іншого.

Висновок

Хеш-функції застосовуються для порівняння даних, прискорення пошуку, генерації ідентифікаторів та контролю цілісності.

Їх використання спрощує роботу з великими обсягами інформації, зменшує час обробки та дозволяє ефективно організовувати доступ до даних без прямого зберігання вмісту.

Павлов Максим

Founder & CEO Onpage School

Оцініть автора
Onpage School