Що таке 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. Доповнення. До повідомлення додають біт 1, потім нулі, а наприкінці — його початкову довжину як 64-бітне число, щоб загальна довжина була кратна 512 бітам.
  2. Блоки. Доповнене повідомлення ділять на блоки по 512 біт.
  3. Стиснення. Кожен блок проходить 64 раунди простих операцій над 32-бітними словами: циклічні зсуви бітів, XOR, AND і додавання за модулем 2³². Ці раунди вмішують блок у внутрішній стан із восьми 32-бітних слів (8 × 32 = 256 біт).
  4. Результат. Після останнього блоку стан і є хешем.

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

Ключові властивості 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

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

  1. Скопіюйте очікуване значення SHA-256 з офіційної сторінки завантаження або з файлу контрольних сум.
  2. Обчисліть хеш завантаженого файлу.
  3. Порівняйте всі 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 одночасно, у режимі «Текст» або «Файл».

Два обмеження: увесь файл спочатку завантажується в пам'ять, тож для 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, тож збіг хешів вважають доказом того, що файли ідентичні.

Спробуйте безкоштовно: Хешування тексту онлайн Безкоштовно, без реєстрації.