Хешування — процес перетворення даних довільного розміру в рядок фіксованої довжини, що використовується для перевірки цілісності та безпечного зберігання паролів. За даними Open Web Application Security Project (OWASP, 2025), правильне використання хеш-функцій запобігає до 70% вразливостей, пов’язаних із витоком облікових даних. Криптографічні хеші лежать в основі цифрових підписів, блокчейн-технологій та контролю версій.
Головне
Хешування — процес обчислення хеш-функції, яка перетворює довільний набір вхідних даних у бітовий рядок фіксованої довжини, який називається дайджестом або хеш-значенням. На відміну від шифрування, хешування є односпрямованим процесом: відновити вихідні дані за хешем неможливо.
Криптографічні хеш-функції мають чотири обов’язкові властивості: детермінованість (однаковий вхід завжди дає однаковий хеш), необоротність (обчислювально неможливо відновити вхід за хешем), лавинний ефект (зміна одного біта на вході змінює в середньому половину бітів хеша) та колізійна стійкість (обчислювально неможливо знайти два різних входи з однаковим хешем).
Важливо розуміти різницю між хешуванням та шифруванням. Шифрування — двобічний процес: зашифровані дані можна розшифрувати за допомогою ключа. Хешування — односпрямований процес: після перетворення дані неможливо відновити. Ця властивість робить хешування ідеальним для зберігання паролів: система зберігає лише хеш, і навіть при витоку бази даних паролі залишаються захищеними.
Не всі хеш-функції однаково придатні для завдань безпеки. Поділ на криптографічні та некриптографічні категорії критично важливий при виборі алгоритму для конкретного завдання в мобільній розробці.
Ці функції навмисно повільні та складні, щоб ускладнити атаки перебором. Вони повинні бути стійкими до колізій та атак на прообраз. Сімейство 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 | Хеш-таблиці, кеші |
| Парольні KDF | bcrypt, scrypt, Argon2 | Зберігання паролів |
Розглянемо найпоширеніші алгоритми хешування, що використовуються в сучасній мобільній розробці. Кожен з них має свої сильні та слабкі сторони.
SHA-256 — символ сучасної криптографії, рекомендований NIST у складі стандарту FIPS 180-4. Алгоритм створює 256-бітний дайджест і є основним компонентом протоколів TLS, блокчейн-мереж та систем контролю версій. За даними звіту NCC Group (2025), SHA-256 використовується в 96% TLS-сертифікатів для підпису certificate transparency.
SHA-3 — найновіше сімейство хеш-функцій, стандартизоване NIST у 2015 році як FIPS 202. На відміну від SHA-2, побудованого на структурі Меркла — Дамгора, SHA-3 засновано на іншій конструкції Keccak із sponge-функцією. Це робить SHA-3 стійким до атак, які можуть з’явитися на SHA-2 у майбутньому. Для мобільних розробників SHA-3 доступний через стандартні криптографічні бібліотеки починаючи з Android 7.0 та iOS 13.
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 спеціально розроблений для хешування паролів: він включає сіль та параметр вартості, який регулює час обчислення. Збільшення вартості вдвічі подвоює час хешування, роблячи перебір неефективним навіть на потужному обладнанні.
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 — переможець конкурсу 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, що дають максимальну продуктивність.
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 було зламано в 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.hashToString() бібліотека генерує криптографічно стійку сіль довжиною 16 байт і вбудовує її у вихідний рядок разом з хешем та параметром вартості. Аналогічно працюють scrypt та Argon2. Це одна з причин, чому експерти рекомендують використовувати спеціалізовані KDF, а не загальні хеш-функції для захисту паролів.
Так, хеші застосовуються для створення білих та чорних списків файлів. Антивірусні бази містять хеші відомих шкідливих програм. Однак зловмисники можуть змінити один байт у програмі, що повністю змінить хеш. Тому сучасні системи використовують fuzzy-хешування (SSDeep, TLSH), яке знаходить семантично схожі файли, а не лише точні збіги.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також