Що таке хеш і чому він скрізь у технологіях?
Ви, напевно, бачили рядки на зразок:
e3b0c44298fc1c149afbf4c8996fb924
27ae41e4649b934ca495991b7852b855
Вони з'являються при завантаженні програмного забезпечення ("перевірте хеш SHA-256"), в розмовах про блокчейн, в обговореннях безпеки паролів та у незліченних інструментах для розробників. Але що таке хеш насправді і чому він такий фундаментальний для сучасних технологій?
Концепція простою мовою
Хеш-функція приймає будь-який вхід — слово, речення, цілий файл — і виробляє вихід фіксованої довжини, що називається хеш-значенням (також: дайджест, контрольна сума або відбиток пальця). Ключові властивості:
- Детермінованість. Один і той самий вхід завжди дає однаковий вихід.
- Фіксована довжина. Незалежно від розміру вхідних даних, вихід завжди однакового розміру.
- Однонаправленість. Неможливо відновити вихідні дані з хеш-виводу.
- Ефект лавини. Мінімальна зміна вхідних даних призводить до абсолютно іншого хешу.
Думайте про це як про відбиток пальця для даних. Так само, як ваш відбиток пальця унікально ідентифікує вас, але не може бути використаний для реконструкції вашого обличчя, хеш унікально ідентифікує фрагмент даних, але не може бути використаний для реконструкції оригіналу.
Простий приклад
Ось що робить хеш-функція SHA-256 з двома дуже схожими входами:
| Вхід | Хеш SHA-256 (перші 16 символів) |
|---|---|
| "Hello" | 185f8db32271fe25... |
| "hello" | 2cf24dba5fb0a30e... |
| "hello!" | ce06092fb948d9ff... |
Зміна одного символу (велика H на малу h) або додавання знака оклику дає абсолютно інший хеш. Жодного шаблону, жодного передбачуваного зв'язку. Це ефект лавини в дії.
Чи знали ви? Хеш SHA-256 порожнього вводу (буквально нічого) — це e3b0c44298fc1c14.... Це добре відома константа. Кожна реалізація SHA-256 у світі виробляє саме цей вихід для порожнього вводу.
Поширені хеш-алгоритми
MD5
- Вивід: 128 біт (32 шістнадцяткових символи)
- Статус: Зламаний для цілей безпеки. Колізії (різні входи з однаковим хешем) можна генерувати за секунди.
- Досі використовується для: Перевірки цілісності файлів там, де безпека не є проблемою (наприклад, перевірка, що завантаження не пошкоджено).
SHA-1
- Вивід: 160 біт (40 шістнадцяткових символів)
- Статус: Застарілий для безпеки. Колізії були продемонстровані.
- Досі використовується для: Застарілих систем, ідентифікаторів коммітів Git.
SHA-256
- Вивід: 256 біт (64 шістнадцяткових символи)
- Статус: Поточний стандарт. Жодних відомих практичних атак.
- Використовується для: Зберігання паролів, цифрових підписів, блокчейну, верифікації файлів, TLS-сертифікатів.
SHA-512
- Вивід: 512 біт (128 шістнадцяткових символів)
- Статус: Поточний стандарт. Ще більший запас безпеки, ніж SHA-256.
- Використовується для: Високозахищених програм, деяких схем хешування паролів.
Увага MD5 і SHA-1 ніколи не слід використовувати для цілей безпеки (паролі, цифрові підписи, сертифікати). Вони криптографічно зламані. Використовуйте SHA-256 або SHA-512 для всього, що пов'язано з безпекою.
Де використовуються хеші
Зберігання паролів
Коли ви створюєте акаунт, сайт не зберігає (або не повинен зберігати) ваш справжній пароль. Замість цього він зберігає хеш вашого пароля. Коли ви входите в систему, система хешує введений вами пароль і порівнює зі збереженим хешем. Якщо вони збігаються — ви ввійшли.
Це означає, що навіть якщо база даних буде зламана, зловмисники отримають хеші, а не паролі. Вони не можуть обернути хеш, щоб знайти ваш пароль (хоча можуть спробувати вгадати його, хешуючи поширені паролі та порівнюючи).
Сучасне хешування паролів іде далі з алгоритмами на зразок bcrypt, scrypt та Argon2, які додають сіль (випадкові дані) і навмисно повільні, щоб унеможливити атаки грубої сили.
Верифікація файлів
Коли ви завантажуєте програмне забезпечення, сайт часто надає хеш SHA-256 файлу. Після завантаження ви самостійно хешуєте файл і порівнюєте. Якщо хеші збігаються — файл саме такий, яким його задумав видавець. Якщо відрізняються — файл був пошкоджений або підроблений під час завантаження.
Очікуваний: a1b2c3d4e5f6...
Ваш файл: a1b2c3d4e5f6... ✓ Збіг — файл автентичний
Блокчейн і криптовалюти
Кожен блок у блокчейні містить хеш попереднього блоку, створюючи нерозривний ланцюжок. Якщо хтось намагається змінити минулу транзакцію, хеш цього блоку змінюється, що розриває ланцюжок від цієї точки вперед, роблячи підробку одразу виявленою.
Майнінг Bitcoin — це по суті змагання за пошук вводу, що дає хеш SHA-256, що починається з певної кількості нулів.
Цифрові підписи
Коли ви цифрово підписуєте документ, ви фактично не шифруєте весь документ своїм приватним ключем. Натомість документ хешується, а хеш шифрується. Це набагато швидше і дає компактний підпис.
Дедублювання даних
Хмарні сховища використовують хеші для виявлення повторюваних файлів. Якщо два користувачі завантажують один і той самий файл, він має однаковий хеш, і сервісу потрібно зберігати лише одну копію.
Система контролю версій Git
Кожен комміт, файл та дерево в Git ідентифікуються хешем SHA-1. Саме так Git знає, чи змінився файл і як відстежує всю історію проекту.
Чи знали ви? Git поступово мігрує з SHA-1 на SHA-256. Перехід розпочався після того, як у 2017 році були продемонстровані колізії SHA-1, що теоретично дозволяє комусь створити два різних комміти з однаковим ідентифікатором.
Проблема необоротності (і чому це важливо)
Однонаправлена природа хешів — це одночасно їхня найбільша сила і часте джерело плутанини.
Хеш не можна "розшифрувати". Хеш — це не шифрування. Шифрування двостороннє: зашифруй ключем, розшифруй ключем. Хешування однонаправлене: можна обчислити хеш з вводу, але не можна обчислити ввід з хешу.
Єдиний спосіб "обернути" хеш — вгадати вихідні дані, захешувати здогадку і перевірити, чи збігається. Для коротких простих вводів (як поширені паролі) це можливо. Для довгих випадкових вводів — обчислювально неможливо.
Ось чому довжина пароля така важлива. Хеш "password123" можна знайти, спробувавши поширені паролі. Хеш "j8#kL9$mN2@pQ5&" зайняв би більше часу, ніж вік Всесвіту, для пошуку методом підбору.
Спробуйте самі
Найкращий спосіб зрозуміти хеші — поекспериментувати. Захешуйте слово, потім змініть один символ і подивіться, як вихід змінюється повністю. Захешуйте файл до і після зміни і побачте різницю.
Порада Генеруйте та перевіряйте хеші для будь-якого тексту або файлу: Як генерувати та перевіряти хеші. Спробуйте SHA-256, MD5, SHA-512 та інші — миттєво, безкоштовно, у вашому браузері.
Досліджуйте хеші на практиці:
Безкоштовно, миттєво і без реєстрації.