Що таке SHA-256? Як працює, MD5 vs SHA-256 і контрольні суми
SHA-256 — це криптографічна хеш-функція, яка перетворює будь-які вхідні дані, від однієї літери до файлу на кілька гігабайтів, на фіксоване 256-бітне значення, яке зазвичай записують як 64 шістнадцяткові символи. Вона належить до родини SHA-2, яку NIST опублікував у стандарті FIPS 180-2 у 2002 році. Однакові вхідні дані завжди дають однаковий хеш, а з хешу неможливо відновити вхідні дані.
Спробуйте безкоштовно: Хешування тексту онлайн Безкоштовно, без реєстрації.
То що таке SHA-256 на практиці і навіщо він потрібен? Насамперед для доказу, що дані не змінилися: на ньому тримаються контрольні суми завантажень, TLS-сертифікати, Git, Bitcoin і підписані API-запити. У цьому посібнику пояснено, як працює SHA-256, чим відрізняються MD5 і SHA-256, що таке контрольна сума і як перевірити контрольну суму SHA-256 у Windows, macOS і Linux. Кожен хеш нижче обчислено програмно й перевірено двічі. Щоб спробувати приклади самостійно, вставте їх у безкоштовний генератор хешів.
Що таке SHA-256?
SHA означає Secure Hash Algorithm (безпечний алгоритм хешування). SHA-2 розробило АНБ (NSA), а стандартизував NIST: спочатку у FIPS 180-2 (2002), а нині у FIPS 180-4. Родина має кілька членів, названих за розміром результату: SHA-224, SHA-256, SHA-384 і SHA-512, а також SHA-512/224 і SHA-512/256. SHA-256 — найпоширеніший із них.
Хеш працює як відбиток пальця для даних. Ось приклад хешу SHA-256 для слова «hello» і для порожнього введення:
SHA-256("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
SHA-256("") = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Обидва результати однакової довжини, бо результат завжди має 256 біт. Це 32 байти, а оскільки одна шістнадцяткова цифра вміщує 4 біти, виходить 256 ÷ 4 = 64 шістнадцяткові символи.
Як працює SHA-256, коротко
- Доповнення. До повідомлення додають біт 1, потім нулі, а наприкінці — його початкову довжину як 64-бітне число, щоб загальна довжина була кратна 512 бітам.
- Блоки. Доповнене повідомлення ділять на блоки по 512 біт.
- Стиснення. Кожен блок проходить 64 раунди простих операцій над 32-бітними словами: циклічні зсуви бітів, XOR, AND і додавання за модулем 2³². Ці раунди вмішують блок у внутрішній стан із восьми 32-бітних слів (8 × 32 = 256 біт).
- Результат. Після останнього блоку стан і є хешем.
Кожен блок змінює стан, з якого починає наступний блок, тому зміна будь-де у вхідних даних впливає на результат.
Ключові властивості SHA-256
- Детермінованість. Ті самі байти завжди дають той самий хеш, на будь-якому комп'ютері.
- Фіксований розмір. І слово з 5 байтів, і файл на 5 ГБ дають 64 шістнадцяткові символи.
- Лавинний ефект. Найменша зміна вхідних даних повністю змінює результат.
- Стійкість до пошуку прообразу. Маючи хеш, немає відомого способу знайти відповідні вхідні дані, крім вгадування.
- Стійкість до колізій. Ніхто ніколи не знайшов двох різних вхідних даних з однаковим хешем SHA-256.
Лавинний ефект легко побачити. «hello» і «Hello» відрізняються однією літерою, а літери h (01101000) і H (01001000) відрізняються лише одним бітом:
SHA-256("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
SHA-256("Hello") = 185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969
Два хеші відрізняються у 125 з 256 бітів, що близько до половини, очікуваної від випадкового результату, і в 61 з 64 шістнадцяткових символів.
Одне обмеження: стійкість до пошуку прообразу захищає непередбачувані дані, а не короткі рядки, які легко вгадати. Хеш «hello» є в кожній онлайн-таблиці пошуку, бо будь-хто може обчислити хеші поширених слів і зберегти результати.
Що таке контрольна сума?
Контрольна сума — це коротке значення, обчислене з даних, щоб згодом можна було з'ясувати, чи змінилися дані. Прості контрольні суми, як-от CRC32, що використовується в ZIP-файлах і мережевих пакетах, виявляють випадкові помилки, наприклад пошкоджене завантаження чи несправний диск, але їх легко підробити навмисно.
SHA-256 як контрольна сума захищає і від навмисної підміни, бо ніхто не може створити змінений файл, що збігався б з оригінальним значенням. Є одна умова: очікуваний хеш має надходити з джерела, якому ви довіряєте, наприклад з офіційного HTTPS-сайту проєкту або з підписаного файлу контрольних сум. Зловмисник, який контролює сторінку завантаження, може підмінити і файл, і опублікований хеш.
Де використовується SHA-256
- Завантаження програм. Дистрибутиви Linux і багато застосунків публікують контрольні суми SHA-256 для своїх інсталяторів, часто у файлі
SHA256SUMS. - TLS-сертифікати. Сертифікат, що захищає HTTPS-сайт, у більшості випадків підписано з використанням хешу SHA-256; це позначається як «sha256WithRSAEncryption» або «ecdsa-with-SHA256». Основні браузери перестали довіряти сертифікатам, підписаним SHA-1, у 2017 році.
- Bitcoin. Майнери хешують заголовки блоків, застосовуючи SHA-256 двічі (подвійний SHA-256), і змінюють число nonce, доки результат не опиниться нижче цільового значення. Цей пошук і є доказом виконаної роботи (proof of work).
- Git. Git традиційно іменує коміти й файли за їхнім хешем SHA-1. Починаючи з версії 2.29 (2020),
git init --object-format=sha256створює репозиторій, що використовує SHA-256 замість нього. - HMAC-SHA256 і JWT. HMAC вмішує в хеш секретний ключ, тож правильне значення може створити лише той, хто має ключ. Так часто підписують вебхуки й API-запити, а алгоритм JWT HS256 — це HMAC із SHA-256; генератор HMAC обчислює таке значення. Не використовуйте замість нього простий
SHA-256(key + message): він вразливий до атак подовження повідомлення (length extension), від яких захищає HMAC.
MD5 vs SHA-256 (а також SHA-1, SHA-512)
| Алгоритм | Результат | Шістнадцяткових символів | Опубліковано | Стан безпеки |
|---|---|---|---|---|
| MD5 | 128 біт | 32 | 1992 (RFC 1321) | Зламаний: практичні колізії з 2004 року |
| SHA-1 | 160 біт | 40 | 1995 (FIPS 180-1) | Зламаний: перша публічна колізія у 2017 році |
| SHA-256 | 256 біт | 64 | 2002 (FIPS 180-2) | Безпечний: відомих колізій немає |
| SHA-512 | 512 біт | 128 | 2002 (FIPS 180-2) | Безпечний: відомих колізій немає |
Ті самі вхідні дані через усі чотири:
MD5("hello") = 5d41402abc4b2a76b9719d911017c592
SHA-1("hello") = aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
SHA-256("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
SHA-512("hello") = 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
Що таке MD5? MD5 — старіший 128-бітний хеш 1992 року. У 2004 році дослідники під керівництвом Сяоюнь Ван (Xiaoyun Wang) показали, як створити два різні вхідні дані з однаковим хешем MD5, а подальші роботи зробили обчислення таких колізій швидким. MD5 не можна використовувати там, де хтось може навмисно підібрати файл із таким самим хешем.
SHA-1 протримався довше. У лютому 2017 року CWI Amsterdam і Google оголосили про SHAttered: два різні PDF-файли з однаковим хешем SHA-1. NIST рекомендує повністю замінити SHA-1 до 31 грудня 2030 року.
SHA-256 не має відомих практичних атак. Пошук колізії перебором потребував би близько 2¹²⁸ спроб, що далеко за межами можливостей будь-якого наявного комп'ютера.
Отже, обираючи між MD5 і SHA-256, використовуйте SHA-256 для всього, що стосується безпеки. MD5 досі годиться там, де ніхто не намагається вас обдурити, наприклад щоб виявити випадкове пошкодження чи знайти дублікати файлів на власному диску.
SHA-256 і SHA-512 обидва безпечні; SHA-256 — найширше підтримуваний варіант за замовчуванням. SHA-3 (FIPS 202, 2015) — окрема конструкція, стандартизована як альтернатива, а не тому, що SHA-2 зламали.
Хешування — це не шифрування
Шифрування, як-от AES, оборотне: маючи правильний ключ, ви отримуєте вихідні дані назад. Хеш не має ні ключа, ні зворотного шляху; він завжди займає 256 біт, хай якими великими є вхідні дані, тож вихідних даних у результаті просто немає. Сайти, що обіцяють «розшифрувати SHA-256», лише шукають хеші поширених слів і паролів, обчислені заздалегідь.
Чому простий SHA-256 не підходить для паролів
SHA-256 створено швидким, і саме це є проблемою для паролів. Якщо база даних із хешами паролів SHA-256 витече, зловмисники можуть перевіряти мільярди варіантів за секунду на відеокартах. Крім того, без солі двоє користувачів з однаковим паролем отримують однаковий хеш.
Паролям потрібна повільна функція хешування із сіллю: Argon2id, scrypt або bcrypt (чи PBKDF2 з великою кількістю ітерацій). Вони роблять кожну спробу дорогою. Докладніше про сіль і про те, що відбувається, коли хешовані паролі витікають, читайте у статті що відбувається, коли пароль хешують.
Як перевірити контрольну суму SHA-256
- Скопіюйте очікуване значення SHA-256 з офіційної сторінки завантаження або з файлу контрольних сум.
- Обчисліть хеш завантаженого файлу.
- Порівняйте всі 64 символи, а не лише перші кілька. Регістр літер у шістнадцятковому записі не має значення.
Якщо значення не збігаються, видаліть файл і завантажте його знову з офіційного джерела.
Windows
У командному рядку:
certutil -hashfile ubuntu.iso SHA256
Завжди додавайте SHA256: без цього certutil використовує SHA-1. У PowerShell Get-FileHash за замовчуванням використовує SHA-256 і може порівняти значення за вас:
Get-FileHash .\ubuntu.iso
(Get-FileHash .\ubuntu.iso).Hash -eq "paste-the-expected-hash-here"
Другий рядок виводить True або False; -eq не враховує регістр, тож результат великими літерами збігається з контрольною сумою малими.
macOS
shasum -a 256 ubuntu.iso
shasum -a 256 -c ubuntu.iso.sha256
Перший рядок виводить хеш. Другий перевіряє його за файлом контрольних сум, що містить хеш, два пробіли та ім'я файлу.
Linux
sha256sum ubuntu.iso
sha256sum -c SHA256SUMS --ignore-missing
З ключем -c sha256sum читає файл контрольних сум і виводить ubuntu.iso: OK або FAILED. --ignore-missing пропускає записи для файлів, які ви не завантажували.
Поширена пастка під час хешування тексту в терміналі: echo "hello" | sha256sum дає 5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03, а не значення 2cf24d… вище, бо echo додає символ нового рядка. Використовуйте printf 'hello' | sha256sum, щоб хешувати рівно п'ять байтів.
У браузері
Генератор хешів MD5 і SHA-256 обчислює MD5, SHA1, SHA224, SHA256, SHA384, SHA512, Keccak-256 і RIPEMD160 одночасно, у режимі «Текст» або «Файл».
- Текст: хешує саме те, що ви ввели, у кодуванні UTF-8, а лічильник показує кількість байтів, тож зайвий пробіл чи перенесення рядка легко помітити.
- Файл: файл читається й хешується локально бібліотекою crypto-js, без завантаження на сервер.
- Перевірка: вставте опубліковане значення в поле «Очікуваний хеш», і відповідний алгоритм буде позначено як «Збіг». Порівняння шістнадцяткових значень ігнорує регістр, пробіли та префікс
0x. - Результат: шістнадцятковий (малими або великими літерами), Base64, Base64url або двійковий.
Два обмеження: увесь файл спочатку завантажується в пам'ять, тож для ISO-образів на кілька гігабайтів краще підходять утиліти командного рядка, описані вище. А рядок із назвою SHA3 — це Keccak-512 з оригінальним доповненням, що відрізняється від NIST SHA3-512.
Часті запитання
Чи можна розшифрувати або обернути SHA-256?
Ні. SHA-256 — одностороння функція без ключа. «Дешифратори SHA-256» знаходять лише вхідні дані, які вже є в їхніх таблицях пошуку; це спрацьовує для поширених слів і слабких паролів, але не для випадкових даних.
Чи SHA-256 досі безпечний?
Так. Відомих практичних атак на SHA-256 для пошуку колізії чи прообразу немає, і NIST досі його схвалює. Навіть великий квантовий комп'ютер з алгоритмом Гровера, наскільки відомо, лише зменшив би зусилля для пошуку прообразу приблизно з 2²⁵⁶ до приблизно 2¹²⁸ операцій.
Чому хеш SHA-256 має довжину 64 символи?
Хеш має 256 біт. У шістнадцятковому записі кожен символ відповідає 4 бітам, отже 256 ÷ 4 = 64 символи. Те саме значення — це 32 байти, або 44 символи в Base64.
Яка різниця між SHA-2 і SHA-256?
SHA-2 — родина хеш-функцій, визначена у FIPS 180-4. SHA-256 — один із її членів, поряд із SHA-224, SHA-384 і SHA-512. Коли програма пише «SHA-2» без зазначення розміру, зазвичай мається на увазі SHA-256.
Чи можуть два файли мати однаковий хеш SHA-256?
Теоретично так, бо можливих файлів нескінченно багато, а можливих хешів лише 2²⁵⁶. На практиці ніхто ніколи не знаходив двох різних вхідних даних з однаковим хешем SHA-256, тож збіг хешів вважають доказом того, що файли ідентичні.
Спробуйте безкоштовно: Хешування тексту онлайн Безкоштовно, без реєстрації.