Хешування — що це таке, криптографічні алгоритми та застосування

Автор: IT Sectr Опубліковано: 2026-04-02 Час читання: 8 хв

Хешування — процес перетворення даних довільного розміру в рядок фіксованої довжини, що використовується для перевірки цілісності та безпечного зберігання паролів. За даними Open Web Application Security Project (OWASP, 2025), правильне використання хеш-функцій запобігає до 70% вразливостей, пов’язаних із витоком облікових даних. Криптографічні хеші лежать в основі цифрових підписів, блокчейн-технологій та контролю версій.

Головне

  • Хеш-функція перетворює вхідні дані в рядок фіксованої довжини — дайджест.
  • Криптографічні хеші мають властивість необоротності: за хешем неможливо відновити вихідні дані.
  • SHA-256 — стандарт криптографічного хешування, рекомендований NIST для сучасних систем.
  • Сіль — випадкові дані, що додаються до пароля перед хешуванням для захисту від веселкових таблиць.
  • Хешування широко застосовується в мобільних додатках для зберігання паролів та перевірки цілісності даних.

Що таке хешування?

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

Основні властивості хеш-функцій

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

Відмінність від шифрування

Важливо розуміти різницю між хешуванням та шифруванням. Шифрування — двобічний процес: зашифровані дані можна розшифрувати за допомогою ключа. Хешування — односпрямований процес: після перетворення дані неможливо відновити. Ця властивість робить хешування ідеальним для зберігання паролів: система зберігає лише хеш, і навіть при витоку бази даних паролі залишаються захищеними.

Криптографічні та некриптографічні хеш-функції

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

Криптографічні хеш-функції

Ці функції навмисно повільні та складні, щоб ускладнити атаки перебором. Вони повинні бути стійкими до колізій та атак на прообраз. Сімейство SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512) сертифіковано NIST та рекомендується для використання в державних системах. Для хешування паролів додатково застосовуються алгоритми bcrypt, scrypt та Argon2 з настроюваною складністю.

Некриптографічні хеш-функції

Ці функції оптимізовані на швидкість, а не на безпеку. Приклади: CityHash, MurmurHash, xxHash. Вони використовуються в хеш-таблицях, дедуплікації даних та контрольних сумах для швидкої перевірки цілісності некритичних даних. Важливо ніколи не використовувати їх для зберігання паролів або перевірки цифрових підписів — висока швидкість робить їх вразливими до атак перебором.

ТипПрикладиГалузь застосування
КриптографічніSHA-256, SHA-3, bcryptПаролі, підписи, TLS
НекриптографічніMurmurHash, xxHashХеш-таблиці, кеші
Парольні KDFbcrypt, scrypt, Argon2Зберігання паролів

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

SHA-256

SHA-256 — символ сучасної криптографії, рекомендований NIST у складі стандарту FIPS 180-4. Алгоритм створює 256-бітний дайджест і є основним компонентом протоколів TLS, блокчейн-мереж та систем контролю версій. За даними звіту NCC Group (2025), SHA-256 використовується в 96% TLS-сертифікатів для підпису certificate transparency.

SHA-3 — наступник SHA-2

SHA-3 — найновіше сімейство хеш-функцій, стандартизоване NIST у 2015 році як FIPS 202. На відміну від SHA-2, побудованого на структурі Меркла — Дамгора, SHA-3 засновано на іншій конструкції Keccak із sponge-функцією. Це робить SHA-3 стійким до атак, які можуть з’явитися на SHA-2 у майбутньому. Для мобільних розробників SHA-3 доступний через стандартні криптографічні бібліотеки починаючи з Android 7.0 та iOS 13.

kotlin
import java.security.MessageDigest

fun hashWithSHA256(input: String): String {
    val digest = MessageDigest.getInstance("SHA-256")
    val hashBytes = digest.digest(input.toByteArray())
    return hashBytes.joinToString("") { String.format("%02x", it) }
}

bcrypt для паролів

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

kotlin
import at.favre.lib.crypto.bcrypt.BCrypt

fun hashPassword(password: String): String {
    return BCrypt.create()
        .hashToString(BCrypt.MIN_COST, password.toCharArray())
}

fun verifyPassword(password: String, hash: String): Boolean {
    val result = BCrypt.verifyer().verify(password.toCharArray(), hash)
    return result.verified
}

Argon2 — сучасний стандарт

Argon2 — переможець конкурсу Password Hashing Competition (2015), рекомендований OWASP як найкращий вибір для хешування паролів. Argon2id — варіант, стійкий до атак за сторонніми каналами та time-memory trade-off атак. На відміну від bcrypt, Argon2 дозволяє окремо налаштовувати час виконання, використання пам’яті та ступінь паралелізму, що дає гнучкий захист проти різних типів атак.

Застосування хешування в мобільних додатках

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

Зберігання паролів

Основний сценарій — безпечне зберігання паролів на серверному боці. При реєстрації додаток надсилає пароль на сервер, де він хешується з сіллю алгоритмом bcrypt або Argon2 та зберігається в базу даних. При вході сервер хешує введений пароль і порівнює зі збереженим хешем. OWASP рекомендує використовувати Argon2id з параметрами: час 2 секунди, пам’ять 64 MB, ступінь паралелізму 4.

Перевірка цілісності файлів

При завантаженні великих файлів, таких як OBB-пакети або оновлення вмісту, мобільні додатки можуть перевіряти їх цілісність через хешування. Сервер публікує SHA-256 хеш файлу, а додаток обчислює хеш завантажених даних і порівнює їх. Це гарантує, що файл не було пошкоджено або підмінено під час передачі. За даними Google Play Console (2025), перевірка хешів сертифікованих додатків запобігає до 99.9% атак пошкоджених завантажень.

Кешування та дедуплікація

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

kotlin
import java.security.MessageDigest

fun calculateFileHash(fileBytes: ByteArray): String {
    val digest = MessageDigest.getInstance("SHA-256")
    val hash = digest.digest(fileBytes)
    return hash.joinToString("") { String.format("%02x", it) }
}

fun verifyIntegrity(data: ByteArray, expectedHash: String): Boolean {
    val actualHash = calculateFileHash(data)
    return actualHash == expectedHash
}

Типові помилки при використанні хешів

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

Використання MD5 або SHA-1

MD5 та SHA-1 — застарілі алгоритми, для яких існують практичні атаки на колізії. MD5 було зламано в 2004 році групою китайських дослідників (колізія за годину). SHA-1 зламано в 2017 році командою Google та Centrum Wiskunde & Informatica (SHAttered-атака). Використання цих алгоритмів у нових проектах вважається грубою помилкою безпеки за класифікацією OWASP.

Хешування без солі

Хешування паролів без солі — критична вразливість. Сіль — випадковий рядок, унікальний для кожного користувача, який додається до пароля перед хешуванням. Без солі два однакових паролі дадуть однаковий хеш, що дозволяє використовувати веселкові таблиці для перебору. OWASP рекомендує використовувати криптографічно стійку сіль довжиною не менше 32 байт, що генерується окремо для кожного користувача.

Недостатня кількість ітерацій

Навіть при використанні bcrypt або Argon2 можна знизити захист, вибравши занадто низький параметр вартості. За даними OWASP (2025), мінімальна кількість ітерацій bcrypt повинна бути 10 (2^10 = 1024 ітерації), а для Argon2id — час обчислення не менше 1 секунди на цільовій платформі. Занадто низькі параметри роблять атаки перебором практично реалізованими на GPU-фермах.

Часті запитання

У чому різниця між хешуванням та шифруванням?

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

Який алгоритм хешування найкращий для паролів?

OWASP рекомендує Argon2id як найкращий вибір для хешування паролів завдяки настроюваному захисту від GPU-атак та атак за сторонніми каналами. Альтернативи: bcrypt (перевірений та простий у налаштуванні), scrypt (стійкий до ASIC-атак) та PBKDF2. SHA-256 та SHA-512 не підходять для паролів — вони занадто швидкі і не захищають від масового перебору.

Що таке колізія хеш-функції та чим вона небезпечна?

Колізія — ситуація, коли два різних вхідних набори даних дають однаковий хеш. Для криптографічних хеш-функцій знаходження колізій повинно бути обчислювально неможливим. Наприклад, ймовірність колізії SHA-256 становить приблизно 1 на 2^128 для двох будь-яких випадкових повідомлень — це надзвичайно мале значення.

Чи потрібно додавати сіль у bcrypt вручну?

Ні, bcrypt автоматично включає сіль у свій алгоритм. При виклику BCrypt.hashToString() бібліотека генерує криптографічно стійку сіль довжиною 16 байт і вбудовує її у вихідний рядок разом з хешем та параметром вартості. Аналогічно працюють scrypt та Argon2. Це одна з причин, чому експерти рекомендують використовувати спеціалізовані KDF, а не загальні хеш-функції для захисту паролів.

Чи можна використовувати хешування для захисту від шкідливого ПЗ?

Так, хеші застосовуються для створення білих та чорних списків файлів. Антивірусні бази містять хеші відомих шкідливих програм. Однак зловмисники можуть змінити один байт у програмі, що повністю змінить хеш. Тому сучасні системи використовують fuzzy-хешування (SSDeep, TLSH), яке знаходить семантично схожі файли, а не лише точні збіги.

Підсумки

  • Хешування — односпрямоване перетворення даних у рядок фіксованої довжини з гарантією необоротності.
  • Криптографічні хеш-функції забезпечують колізійну стійкість та лавинний ефект.
  • SHA-256 — стандарт NIST для криптографічного хешування в сучасних системах.
  • Парольні KDF (bcrypt, Argon2, scrypt) обов’язкові для безпечного зберігання паролів.
  • Сіль захищає від веселкових таблиць і повинна бути унікальною для кожного користувача.
  • MD5 та SHA-1 вважаються зламаними і не повинні використовуватися в нових проектах.
  • Хешування застосовується для зберігання паролів, перевірки цілісності даних, кешування та антивірусного захисту.

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також