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.