Содержание:
- 1 Основные понятия криптографии
- 2 Что такое хэш-функция
- 3 Как хэш-функция используется в блокчейне
- 4 Майнинг — это хэш-игра
- 5 Очень краткая история цифровых денег
- 6 Что такое криптографические хеш-функции?
- 7 Пример
- 8 Как работают криптографические хеш-функции
- 9 Как хеш-функции применяются в блокчейне
- 10 Криптография обеспечивает консенсус
- 11 10-минутное решение
- 12 Хеш-функции
- 13 Цифровые подписи
Поделиться в соцсетях:
В основе технологии блокчейн лежит криптография — наука о методах обеспечения конфиденциальности информации и сохранения ее подлинности. Говоря простыми словами, это наука о шифровании данных (наука о криптосистемах).
Сегодня мы расскажем о ключевых понятиях криптографии, на которых строится блокчейн, и о главном элементе этой системы — хэш-функции.
Основные понятия криптографии
Главной задачей криптографии является защита данных от изменения и несанкционированного доступа к ним в процессе их хранения и передачи от отправителя к получателю. Это достигается путем использования следующих элементов в системе хранения, обработки и обмена информацией:
- Криптографические ключи — случайная последовательность символов, упорядоченная по определенным правилам. Каждый ключ уникален, последовательности символов никогда не повторяются. Ключ может принадлежать одному пользователю или группе пользователей.
- Конфиденциальность — достигается за счет использования специальных алгоритмов и методов шифрования (симметричного и асимметричного), взаимной аутентификации абонентов (обмен паролями), цифровых сертификатов и подписей, и т. п.
- Целостность и подлинность передаваемых данных — сохраняется путем шифрования, подтверждается электронной подписью.
- Аутентификация — установка соединения только между легальными участниками системы, защита от взломов. Для получения доступа в систему абонент должен пройти проверку и подтвердить свои права пользователя.
- Шифрование данных — фундамент, на котором строится вся система защиты информации. Шифр — это преобразование исходной информации в иную форму ее представления, но с сохранением всех изначальных данных. Дешифрование — восстановление исходного сообщения при помощи ключа шифрования.
Все коммуникации внутри сети блокчейн функционируют по принципам криптографии, то есть подлинность внесения любых изменений в базу данных проверяется, подделка невозможна, все отправители и получатели информации идентифицируются, несанкционированное добавление нового блока в сеть невозможно.
Что такое хэш-функция
Криптографическая хэш-функция преобразует данные в буквенное или цифровое выражение, формируя строку букв или цифр, которая называется хэшем и имеет ограниченную длину. Так, хэш криптовалюты биткоин содержит 64 символа.
Трудно представить, что любой объем данных можно вместить в такую относительно короткую строку, но именно в этом и заключается уникальность хэш-функции. Например, хэш слова «пес» имеет такой вид:
Но и целый абзац из 5-6 строк будет умещаться в строчке точно такой же длины, но с иным набором символов.
Как хэш-функция используется в блокчейне
Чтобы блокчейн работал, должно все время происходить его обновление — добавление записей о новых транзакциях в сети. Именно в процессе добавления в систему новой информации она становится наиболее уязвимой для атак. Но благодаря строгой иерархии в блокчейне гарантируется подлинность всех записей и их защита от несанкционированного изменения.
Использование хэш-функции гарантирует неизменность уже существующей цепочки транзакций. Новый блок ссылается на хэш предыдущего.
Благодаря хэшам общее состояние блокчейна (все когда-либо проведенные операции в сети) можно выразить всего одним числом — хэшем нового блока. За счет этого обеспечивается неизменность и стабильность работы блокчейна.
Майнинг — это хэш-игра
Для функционирования сети блокчейн в ней должны создаваться все новые и новые блоки. Для добавления нового блока сеть должна прийти к консенсусу. Для этого майнеры предлагают свои версии блоков, они проходят верификацию, и сеть выбирает блок, который становится следующим элементом реестра. Но многие майнеры предлагают одинаковые блоки. Тогда каким же образом выбирается тот блок, который станет следующим звеном цепи?
Все очень просто: компьютеры в сети соревнуются в своеобразной хэш-игре, перебирая множество вариантов значения «нонс» (nonce). Это число дающее определенный хэш в комбинации с предыдущими данными при вводе в хэш-функцию.
При нахождении правильного значения, его добавлении в блокчейн и вводе в хэш-функцию формируется рандомный хэш — так называемое «решение задачи». Вычисливший его компьютер получает «приз» — криптовалюту биткоин.
Таким образом поддерживается консенсус в сети блокчейн и предотвращаются хакерские атаки. Все хэши абсолютно уникальны, и только в ходе нахождения правильного значения нонс в комбинации с верными, ранее верифицированными данными получается новый хэш, решающий уравнение.
Если данные искажены, решить задачу невозможно. На этом основан принцип блокчейна и механизм безопасности хранения данных в нем.
Сейчас практически невозможно взломать систему, работа которой построена на использовании криптографической хэш-функции. Для этого потребуются запредельные вычислительные мощности и огромное количество времени на решение задачи. С добавлением каждого нового элемента в системе, ее устойчивость к атакам растет. Технология блокчейн по уровню надежности многократно превосходит все другие системы защиты информации.
Для меня ключ к познанию блокчейна – это понимание криптографических хешей. Мне кажется, многие из нас, обычных людей, делают ошибку, представляя себе блокчейн как, в первую очередь, списки анонимных транзакций, распределённых по децентрализованным сетям. Хотя отдельный блокчейн действительно таков, иногда упускается из виду, что основой блокчейновой технологии является не децентрализация, анонимность или даже распредёленные реестры, а собственно криптография. Хотя это, наверное, очевидно для человека с базовым пониманием компьютерных наук, для большинства из нас это нечто совершенно новое.
Очень краткая история цифровых денег
Биткойн – новый подход к предыдущим экспериментам с цифровыми деньгами. В 1990-х это была горячая, но спекулятивная тема. Даже Алан Гринспен в своей речи в 1996 г. сказал:
Мы предвидим в близком будущем предложения эмитентам электронных платёжных обязательств, таких как карты с хранимой стоимостью или «цифровые деньги», создать специализированные эмиссионные корпорации с сильными балансовыми отчетами и публичными кредитными рейтингами
Таким образом, использование цифровой валюты истеблишментом было на повестке дня задолго до Биткойна. Для того чтобы освободить цифровую валюту от истеблишмента, требовалось ещё одно новшество. Этим новшеством стала криптография.
Когда Гринспен произносил свою речь, шифропанки уже экспериментировали с цифровыми валютами с явным намерением дестабилизировать банки. В числе их экспериментов, существовавших до Биткойна, были Hashcash Адама Бэка, BitGold Ника Сабо, B-Money Вэй Дая и RPOW Хэла Финни. Все они использовали возможности криптографических хеш-функций, и вместе они образуют гигантские плечи, на которых сегодня стоит Биткойн.
Что такое криптографические хеш-функции?
Криптографическая хеш-функция берёт данные и, по сути, переводит их в строку букв и цифр. Вы когда-нибудь пользовались URL-сокращалками типа Bitly или TinyURL? Это нечто похожее. Вы вводите что-то длинное, а на выходе получается что-то короткое, олицетворяющее то длинное. Только в случае криптографических хеш-функций ввод не обязательно должен быть длинным. Это может быть что-то очень короткое (например, слово «пёс») или почти бесконечно длинное (например, весь текст «Повести о двух городах»), и на выходе вы получите уникальную строку установленной длины. Кроме того, в отличие от сокращателей ссылок, хеш-функции, применяемые в Биткойне, действуют только в одном направлении. Хотя одни и те же данные всегда дадут один и тот же хеш, воспроизвести изначальные данные по полученному из них хешу невозможно.
Итак, данные вводятся в хеш-функцию, функция выполняется и получается строка букв и цифр (можете попробовать самостоятельно здесь). Эта строка называется хешем. В блокчейне Биткойна хеши состоят из 256 бит или 64 символов.
Может показаться невозможным, чтобы почти бесконечное количество данных могло последовательно переводиться в уникальную строку всего из 64 символов, но именно таким чудесным образом действуют криптографические функции. С помощью этой невероятной технологии целые книги, заполненные текстом, могут быть переведены в одну строку из 64 цифр и букв. И каждый раз, когда вы вводите одни и те же данные, вы получите не только один и тот же хеш, но уникальный и отличный от любого другого хеша.
Пример
Это было самое прекрасное время, это было самое злосчастное время, – век мудрости, век безумия, дни веры, дни безверия, пора света, пора тьмы, весна надежд, стужа отчаяния, у нас было всё впереди, у нас впереди ничего не было, мы то витали в небесах, то вдруг обрушивались в преисподнюю, – словом, время это было очень похоже на нынешнее, и самые горластые его представители уже и тогда требовали, чтобы о нём – будь то в хорошем или в дурном смысле – говорили не иначе, как в превосходной степени:
Тогда как хеш слова «пёс»:
Как работают криптографические хеш-функции
Существуют разные виды криптографических хеш-функций, и каждая из них работает по-разному. Использовавшаяся выше хеш-функция – SHA-256, хеш-функция, применяемая в Биткойне, – работает на основе безумно сложной формулы, связанной с отражением света от эллипсов. Вам не стоит слишком из-за этого переживать. Суть в том, что криптографические хеш-функции – это чертова магия, и вы никогда их до конца не поймете, если только вы не математик.
Как хеш-функции применяются в блокчейне
Чтобы блокчейн работал, он должен обновляться. Подобно банку, он должен вести актуальные записи всех транзакций и активов (например, биткойнов), имеющихся у каждого участника сети. Именно при обновлении транзакционной информации любая аутентифицирующая система уязвима для атаки. Банк сглаживает этот риск благодаря наличию строгой централизованной иерархии, гарантирующей подлинность на свой собственный риск. Так как блокчейну удаётся обновляться, оставаясь децентрализованным? Он использует криптографическую вероятностную хеш-игру, называемую «доказательство выполнения работы» (Proof of Work).
Криптография обеспечивает консенсус
Чтобы продолжать функционировать, блокчейн должен создавать новые блоки. Так как блокчейны – это децентрализованные системы, новые блоки должны создаваться не единственным аутентифицирующим субъектом, а сетью в целом. Чтобы решить, каким будет новый блок, сеть должна достичь консенсуса. Чтобы достичь консенсуса, майнеры предлагают определённые блоки, блоки верифицируются, и, наконец, сеть выбирает единственный блок, который будет следующей частью реестра. Однако очень много майнеров предлагают идентичные блоки, проходящие верификацию. Так каким образом конкретный блок выбирается, чтобы стать следующим в цепи?
Компьютеры соревнуются в хеш-игре. Всё очень просто. По сути, чтобы выиграть игру, майнящий компьютер должен угадать число, называемое «нонс» (nonce), которое в комбинации со всеми предыдущими данными блокчейна даёт при вводе в хеш-функцию SHA-256 определённый хеш.
Помните хакеров из фильмов, использующих программу, угадывающую миллион паролей в минуту, чтобы взломать компьютер? Это что-то вроде этого. Все майнеры мира одновременно используют похожую программу-угадайку, ищущую правильный нонс, который при добавлении к данным блокчейна и вводе в хеш-функцию SHA-256 даст рандомный хеш, который сам блокчейн «определил» как «решение» задачи. Компьютеры, в каком-то смысле, работают совместно, так как каждый предложенный хеш не может быть предложен снова. Компьютер, первым отгадавший правильное число, выигрывает право на создание следующего блока и получает 12,5 биткойна, что сейчас равно примерно $50 000.
Так обеспечивается консенсус, а также предотвращаются атаки, нацеленные на манипулирование системой. Так как результатом каждого ввода является совершенно уникальный хеш, только определенный нонс в комбинации с верными ранее верифицированными блокчейновыми данными даст хеш, решающий уравнение. При вводе неточных или мошеннических предшествующих записей не может быть угадан верный хеш. Таким образом, криптография делает блокчейны более безопасными, чем любой банк с человеческой верификацией.
Тем не менее, поскольку постепенно всё больше людей выделяли всё больше компьютерной мощности на майнинг биткойнов, возникла новая проблема. Новаторы разработали мощные компьютеры, предназначенные исключительно для майнинга биткойнов. Эти компьютеры способны предлагать хеши намного чаще, чем средний компьютер, что позволяет им прийти к верной догадке намного быстрее и, как следствие, намайнить больше биткойнов.
Проблема заключается в том, что когда всё меньше людей могут позволить себе майнинговые технологии, риск централизации возрастает. Блоки создаются и биткойны майнятся, как только находится решение следующего блока. Таким образом, имеющий ресурсы может просто собрать более мощную майнинговую машину, чем у всех других, и майнить огромный процент остающихся биткойнов быстрее всех других, просто предлагая больше догадок в более короткий срок.
10-минутное решение
Сатоши предусмотрел механизм, сглаживающий эту проблему, и он также полагается на возможности хеш-функций. Вот как я предпочитаю смотреть на его решение:
Представьте, что ваша хеш-функция на выходе вместо цифр и букв даёт животных. Существует равная вероятность, что при вводе рандомных данных хеш-функция выдаст слона или обезьяну. Ваши случайно выбираемые данные могут быть переведены либо в одно, либо в другое животное с одинаковой вероятностью.
Но теперь представьте, что вы задаёте определённые критерии того, в какое животное должна перевести ваши данные хеш-функция, чтобы работать. Это влияет на вероятность хеширования тех или иных данных в животное, удовлетворяющее вашим критериям. Например, данные «abc123» с большей вероятностью выдадут любое животное (на самом деле в данном примере вероятность 100%), чем любое двуногое, потому что существует намного больше потенциальных догадок, подходящих под любое животное, чем под любое двуногое. Ещё меньше вероятность получить любую обезьяну.
Блокчейн Биткойна работает так, что игра на отгадывание самокорректируется, чтобы всегда быть достаточно сложной, чтобы все компьютеры сети могли угадывать только каждые 10 минут, независимо от мощности отгадывающих компьютеров. Это значит, что угадывание хеша и майнинг блока сегодня теоретически намного сложнее, чем при запуске Биткойна в 2009 г., потому что в сети очень много сверхмощных компьютеров. И в самом деле, сегодня невозможно майнить биткойны с помощью обычного ноутбука, тогда как в ранние дни Биткойна все участники сети использовали стандартные компьютеры.
Так как же протокол Биткойна гарантирует, что игра на отгадывание будет становиться достаточно сложной, чтобы даже чрезвычайно мощным майнинговым компьютерам на отгадывание требовалось примерно 10 минут? Вспомните пример с обезьяной. Чем более конкретные критерии заданы для выхода хеш-функции, тем больше догадок нужно сделать, чтобы получить этот более конкретный выход. Вместо того чтобы «правильным» ответом было животное (легко), двуногое (сложно) или обезьяна (сложнее), для «правильной» строки хеша, выигрывающей игру, задаются всё более конкретные критерии. В частности, игра усложняется посредством требования наличия у правильного хеша в начале определённого количества нулей.
Представьте себе это следующим образом. Если я попрошу вас отгадать рандомное трёхзначное число, чтобы получить шоколадку, у вас больше шансов угадать, если правильное число – любое трёхзначное число, чем если это любое трёхзначное число, начинающееся с 0. Это сложно понять, но в основе лежит математический закон, говорящий, что достаточно квадратного корня N рандомных событий, чтобы вероятность их совпадения составляла 50%. Та же самая математика поддерживает парадокс дней рождения – если в комнате всего 23 человека, существует 50% вероятность, что у двух из них день рождения в один и тот же день.
К сожалению, делая угадывание числа всё сложнее и сложнее, блокчейн Биткойна неизбежно пришел к исключению из майнинга обычных людей. Но это справедливая цена децентрализации. Без этого одна богатая компания могла бы теоретически создать чрезвычайно мощный компьютер, способный мгновенно добыть все оставшиеся биткойны.
Должен заметить, что я лишь (с трудом) понимаю, как работает блокчейн Биткойна.
/ изображение BTC Keychain CC
Хеш-функции
Хеширование — это процесс преобразования массива входных данных произвольной длины в (выходную) битовую строку фиксированной длины. Например, хеш-функция может принимать строку с любым количеством знаков (одна буква или целое литературное произведение), а на выходе получать строку со строго определенным числом символов (дайджест).
Хеш-функции имеются практически в любом языке программирования. Например, они используются для реализации хеш-таблиц и множеств (HashMap/HashSet в Java, dict и set в Python, Map, Set и объекты в JavaScript и так далее). Отдельная категория хеш-функций — криптографические хеш-функции. К ним предъявляются существенно более строгие требования, чем к функциям, обычно используемым в хеш-таблицах. Поэтому и применяются они в более «серьезных» случаях, например для хранения паролей. Криптографические хеш-функции вырабатываются и тщательно проверяются исследователями по всему миру.
Поэкспериментировать с хеш-функциями можно, написав простую программу на Python:
Функция hash_hex() рассчитывает представление хеша в шестнадцатеричной записи для строки. В приведенном примере используется функция SHA-256 — та же, что и в биткойне.
Хорошая хеш-функция обеспечивает защиту от коллизий (невозможно получить два одинаковых хеша при разных начальных данных) и обладает так называемым эффектом лавины, когда малейшее изменение входных данных значительно преобразует выходное значение. Эффект лавины в хеш-функции SHA-256 выглядит следующим образом:
Хеш-функции в блокчейнах гарантируют «необратимость» всей цепочки транзакций. Дело в том, что каждый новый блок транзакций ссылается на хеш предыдущего блока в реестре. Хеш самого блока зависит от всех транзакций в блоке, но вместо того, чтобы последовательно передавать транзакции хеш-функции, они собираются в одно хеш-значение при помощи двоичного дерева с хешами (дерево Меркла). Таким образом, хеши используются как замена указателям в обычных структурах данных: связанных списках и двоичных деревьях.
За счет использования хешей общее состояние блокчейна — все когда-либо выполненные транзакции и их последовательность — можно выразить одним-единственным числом: хешем самого нового блока. Поэтому свойство неизменности хеша одного блока гарантирует неизменность всего блокчейна.
Ниже приведена рекурсивная реализация дерева Меркла, используемая в биткойне, на языке Python (по ссылке вы найдете примеры работы). На вход функции подается список хешей транзакций. На каждом этапе вычисления последовательные пары хешей склеиваются при помощи хеш-функции; если хешей нечетное число, то последний дублируется. В результате остается единственный хеш, который и является конечным хеш-значением для всего списка.
Хеш-деревья имеют много применений помимо блокчейнов. Они используются в файловых системах для проверки целостности файлов, распределенных БД для быстрой синхронизации копий и в управлении ключами для надежного журналирования выдачи сертификатов. Git использует обобщение хеш-деревьев — направленные ациклические графы на основе хешей. В блокчейне использование хеш-деревьев продиктовано соображениями производительности, так как они делают возможным существование «легких клиентов», которые обрабатывают лишь малую часть транзакций из блокчейна.
Цифровые подписи
Цифровые подписи в блокчейнах базируются на криптографии с открытым ключом. В ней используются два ключа. Первый — закрытый ключ — нужен для формирования цифровых подписей и хранится в секрете. Второй — открытый ключ — используется для проверки электронной подписи. Открытый ключ реально вычислить на основе закрытого ключа, а вот обратное преобразование требует невозможного на практике объема вычислений, сравнимого с брут-форсом.
Существует множество различных схем криптографии с открытым ключом. Две самые популярные из них — это схемы на основе разложения на множители (RSA) и схемы на основе эллиптических кривых. Последние более популярны в блокчейнах из-за меньшего размера ключей и подписей. Например, в биткойне используется стандарт эллиптической криптографии ECDSA вместе с эллиптической кривой secp256k1. В ней закрытый ключ имеет длину 32 байта, открытый — 33 байта, а подпись — около 70 байт.
Общая идея подписей с открытым ключом выглядит следующим образом. Предположим, что Алиса хочет перевести Бобу один биткойн. Для этого она формирует транзакцию, где записывает, откуда его следует брать (указание на предыдущую транзакцию, в которой Алиса получила биткойн от кого-то еще) и кому отправить (открытый ключ Боба). Алиса знает открытый ключ Боба из сторонних источников — Боб может послать его Алисе через мессенджер или даже опубликовать его на сайте.
Затем Алиса подписывает транзакцию, используя свой секретный ключ. Любой узел в биткойн-сети может проверить, что транзакция подписана определенным открытым ключом (аутентификация), с которым до выполнения транзакции был ассоциирован один биткойн (авторизация). Если эти условия выполнены, то переведенный биткойн начинает ассоциироваться с открытым ключом Боба.
Поскольку в блокчейне нет центрального узла, который может авторизовать произвольные транзакции, безопасность системы становится децентрализованной, а вероятность успешного вмешательства в работу блокчейна снижается практически до нуля.
Таким образом, блокчейн использует цифровые подписи для аутентификации и обеспечения целостности транзакций (и иногда блоков). В случае криптовалюты процесс аутентификации означает, что потратить средства может только тот человек, которому они были посланы другой, более ранней, транзакцией. Особенность блокчейна состоит в том, что информация об аутентификации «вшита» в каждую транзакцию, а не отделена от бизнес-логики, поэтому блокчейн считается более защищенным. В обычной системе можно взломать или административно обойти механизм аутентификации и провести манипуляции с бэкэндом, а в блокчейне сделать этого не получится по определению.
«>