25 / 736SHA²

SHA-256

Цифровий відбиток даних

Текст, файл або заголовок блока Bitcoin можна представити коротким відбитком. Як він допомагає помітити зміну даних, що шукають майнери і чому хешування — не шифрування?

SHA-256 — це точно визначений алгоритм, який обчислює відбиток даних, тобто хеш. Однакові вхідні дані завжди дають однаковий результат довжиною 256 біт: 32 байти, які зазвичай записують як 64 шістнадцяткові символи. Bitcoin використовує його для зв’язування й перевірки даних та в майнінгу. Але відбиток не є зашифрованою копією початкового вмісту.

Уявіть, що вам надіслали файл і його хеш. Обчисливши хеш самостійно, ви можете перевірити, чи відповідають завантажені дані цьому відбитку. Навіть невелика зміна входу з дуже високою ймовірністю змінить увесь результат. Проте відбиток сам по собі не говорить, хто створив файл і чи безпечний він. Якщо зловмисник підмінить і файл, і його хеш, вони збігатимуться. Тому важлива також надійність джерела контрольного значення. [1] [5]

Для трьох байтів ASCII abc без лапок і перенесення рядка результатом буде ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad. Це не випадково згенероване число: кожна правильна реалізація отримає з тих самих байтів саме цей результат. Додавши пробіл або перенесення рядка, ви зміните вхідні дані. Інший хеш у такому разі не означає помилки алгоритму. Для тексту має значення й кодування. [3]

Шифрування має дозволяти відновити повідомлення за допомогою ключа. SHA-256 не має ані такого ключа, ані зворотної процедури. Проте ймовірні входи можна перебирати: якщо хтось підозрює, що ви хешували чотиризначний PIN, він може перевірити всі 10 000 комбінацій і порівняти результати. Довгий хеш не додає слабкому секрету відсутньої ентропії (тобто непередбачуваності вхідних даних). Безпека залежить і від того, скільки варіантів зловмисникові справді доведеться перевірити. [5] [7]

Ідентифікатори блоків, txid (ідентифікатори транзакцій) та об’єднання пар хешів у Merkle Tree (дереві пов’язаних хешів) використовують SHA256(SHA256(data)). Другий прохід обробляє 32 сирі байти першого результату, а не його текстовий запис із 64 символів. Вихід і далі має 256 біт. Подвійне хешування тут є правилом протоколу, а не свідченням зламу одинарного SHA-256. Bitcoin використовує й інші конструкції: наприклад, Taproot додає до входу наперед визначені мітки, щоб розмежувати різні призначення хешування. [2] [4] [6]

Майнер багаторазово змінює дозволені дані в заголовку блока-кандидата й обчислює його подвійний SHA-256. Він шукає результат, який як число не перевищує встановлений target (граничне числове значення). Майнер не розшифровує повідомлення і не шукає чужий приватний ключ. Пошук придатного заголовка потребує багатьох спроб; перевірка швидка. Заголовок також посилається на попередній блок, тому зміна старого блока порушує наступні зв’язки. Full Node (вузол, що самостійно перевіряє правила Bitcoin) додатково перевіряє транзакції й решту правил: сам по собі відповідний хеш не робить недійсний блок дійсним. [4]

Можливих повідомлень більше, ніж 256-бітових відбитків, тому деякі різні входи неминуче мають однаковий хеш. Це колізія. Важливо, чи можемо ми цілеспрямовано її знайти. Для ідеального 256-бітового хешу загальний пошук будь-якої колізії потребує порядку 2^128 спроб; пошук входу для наперед заданого відбитка — порядку 2^256. Це різні завдання. Знайдена колізія сама по собі не розкриває приватного ключа Bitcoin. Ці числа також не гарантують безпеки всього гаманця чи протоколу. [5]

SHA-256 — складова, а не готове розв’язання кожної проблеми безпеки. Він навмисно швидкий, тому сам по собі непридатний для зберігання паролів, вигаданих людьми: зловмисник міг би швидко перевіряти здогадки. Для цього існують спеціальні процедури отримання значення з пароля, наприклад із налаштовуваною обчислювальною вартістю. Так само власний рецепт «щось захешую й отримаю безпечний ключ» не розв’язує проблеми початкової випадковості чи витоку входу. Зазвичай користувачеві не потрібно обчислювати SHA-256 вручну, але варто розуміти, що доводить перевірений відбиток, а чого — ні. [8] [7]

SHA-256 належить до сімейства SHA-2, а його алгоритм описано в NIST FIPS 180-4. Перед обчисленням він доповнює вхід, зокрема інформацією про його довжину, і обробляє його частинами по 512 біт, кожну за 64 раунди. Ці внутрішні блоки містять 64 байти й не є блоками Bitcoin. Заголовок блока Bitcoin має 80 байтів; увесь блок додатково містить транзакції. Число 256 у назві означає довжину отриманого відбитка, а не розмір блока чи приватного ключа. [1] [4]

Для повної картини прочитайте також Hash, Proof of Work, Block Header, Біткоїн-адреса, Merkle Tree, Bitcoin. На цю статтю також посилаються Hash, ASIC Miner, Hashrate, Nonce.

DOC · 001NIST FIPS 180-4: SHA-256Первинне джерело DOC · 002Bitcoin Core v29.0: hash constructionsПервинне джерело DOC · 003Bitcoin Core v29.0: hash test vectorsПервинне джерело DOC · 004Bitcoin Developer Reference — Block headers and Merkle treesПервинне джерело DOC · 005NIST SP 800-107 Rev. 1 — Hash security propertiesПервинне джерело DOC · 006BIP 340 — Tagged hashesПервинне джерело DOC · 007RFC 4086 — Unpredictability and entropyПервинне джерело DOC · 008NIST SP 800-63B-4 — Password storageПервинне джерело
Переглянуто: Спочатку джерела · Не інвестиційна порада