• Главная
  • Контакты
Подписаться:
  • Twitter
  • Facebook
  • RSS
  • VK
  • PushAll
logo

logo

  • Все
    • Положительные
    • Отрицательные
  • За сегодня
    • Положительные
    • Отрицательные
  • За вчера
    • Положительные
    • Отрицательные
  • За 3 дня
    • Положительные
    • Отрицательные
  • За неделю
    • Положительные
    • Отрицательные
  • За месяц
    • Положительные
    • Отрицательные
  • За год
    • Положительные
    • Отрицательные
  • Сортировка
    • По дате (возр)
    • По дате (убыв)
    • По рейтингу (возр)
    • По рейтингу (убыв)
    • По комментам (возр)
    • По комментам (убыв)
    • По просмотрам (возр)
    • По просмотрам (убыв)
Главная
  • Все
    • Положительные
    • Отрицательные
  • За сегодня
    • Положительные
    • Отрицательные
  • За вчера
    • Положительные
    • Отрицательные
  • За 3 дня
    • Положительные
    • Отрицательные
  • За неделю
    • Положительные
    • Отрицательные
  • За месяц
    • Положительные
    • Отрицательные
  • Главная
  • «Криптография в блокчейнах»: о хеш-функциях, ключах и цифровых подписях

«Криптография в блокчейнах»: о хеш-функциях, ключах и цифровых подписях +17

24.04.2017 15:00
alinatestova 14 5800 Источник
Разработка под e-commerce*, Криптография*, Информационная безопасность*, Блог компании Bitfury Group
Криптография — это сердце блокчейна, которое обеспечивает работу системы. Архитектура блокчейна предполагает, что доверие между участниками сети базируется на принципах математики и экономики, то есть является формализованным. Криптография также гарантирует безопасность, причем основанную на прозрачности и проверяемости всех операций, а не на традиционном для индустрии ограничении видимости системы (perimeter security).

Различные криптографические техники гарантируют неизменность журнала транзакций блокчейна, решают задачу аутентификации и контролируют доступ к сети и данным в блокчейне в целом. В сегодняшнем материале мы поговорим о хеш-функциях, ключах и цифровых подписях.


/ изображение BTC Keychain CC

Хеш-функции


Хеширование — это процесс преобразования массива входных данных произвольной длины в (выходную) битовую строку фиксированной длины. Например, хеш-функция может принимать строку с любым количеством знаков (одна буква или целое литературное произведение), а на выходе получать строку со строго определенным числом символов (дайджест).

Хеш-функции имеются практически в любом языке программирования. Например, они используются для реализации хеш-таблиц и множеств (HashMap/HashSet в Java, dict и set в Python, Map, Set и объекты в JavaScript и так далее). Отдельная категория хеш-функций — криптографические хеш-функции. К ним предъявляются существенно более строгие требования, чем к функциям, обычно используемым в хеш-таблицах. Поэтому и применяются они в более «серьезных» случаях, например для хранения паролей. Криптографические хеш-функции вырабатываются и тщательно проверяются исследователями по всему миру.

Поэкспериментировать с хеш-функциями можно, написав простую программу на Python:

import hashlib
def hash_hex(message):
    return hashlib.sha256(message.encode()).hexdigest()

Функция hash_hex() рассчитывает представление хеша в шестнадцатеричной записи для строки. В приведенном примере используется функция SHA-256 — та же, что и в биткойне.

Хорошая хеш-функция обеспечивает защиту от коллизий (невозможно получить два одинаковых хеша при разных начальных данных) и обладает так называемым эффектом лавины, когда малейшее изменение входных данных значительно преобразует выходное значение. Эффект лавины в хеш-функции SHA-256 выглядит следующим образом:

>>> hash_hex('Blockchain')
'625da44e4eaf58d61cf048d168aa6f5e492dea166d8bb54ec06c30de07db57e1'
>>> hash_hex('blockchain')
'ef7797e13d3a75526946a3bcf00daec9fc9c9c4d51ddc7cc5df888f74dd434d1'
>>> hash_hex('Bl0ckchain')
'511429398e2213603f4e5dd3fff1f989447c52162b0e0a28fe049288359220fc'

Хеш-функции в блокчейнах гарантируют «необратимость» всей цепочки транзакций. Дело в том, что каждый новый блок транзакций ссылается на хеш предыдущего блока в реестре. Хеш самого блока зависит от всех транзакций в блоке, но вместо того, чтобы последовательно передавать транзакции хеш-функции, они собираются в одно хеш-значение при помощи двоичного дерева с хешами (дерево Меркла). Таким образом, хеши используются как замена указателям в обычных структурах данных: связанных списках и двоичных деревьях.

За счет использования хешей общее состояние блокчейна — все когда-либо выполненные транзакции и их последовательность — можно выразить одним-единственным числом: хешем самого нового блока. Поэтому свойство неизменности хеша одного блока гарантирует неизменность всего блокчейна.


Ниже приведена рекурсивная реализация дерева Меркла, используемая в биткойне, на языке Python (по ссылке вы найдете примеры работы). На вход функции подается список хешей транзакций. На каждом этапе вычисления последовательные пары хешей склеиваются при помощи хеш-функции; если хешей нечетное число, то последний дублируется. В результате остается единственный хеш, который и является конечным хеш-значением для всего списка.

import hashlib
    
def merkle_root(lst):
    # Биткойн использует для склеивания хешей два прогона SHA-256 и изменение 
    # порядка байтов. Зачем, не до конца понятно.
    sha256d = lambda x: hashlib.sha256(hashlib.sha256(x).digest()).digest()
    hash_pair = lambda x, y: sha256d(x[::-1] + y[::-1])[::-1]

    if len(lst) == 1: return lst[0]
    
    # Дублирование элементов в дереве приводит к интересной уязвимости -
    # получается, что различные списки транзакций могут иметь один и тот же хеш.
    # По этой причине в биткойне даже есть специальный комментарий,
    # предостерегающий разработчиков новых криптовалют:
    # https://github.com/bitcoin/bitcoin/blob/master/src/consensus/merkle.cpp#L9
    if len(lst) % 2 == 1:
        lst.append(lst[-1])
    return merkle_root([ hash_pair(x, y) 
        for x, y in zip(*[iter(lst)] * 2) ])

Хеш-деревья имеют много применений помимо блокчейнов. Они используются в файловых системах для проверки целостности файлов, распределенных БД для быстрой синхронизации копий и в управлении ключами для надежного журналирования выдачи сертификатов. Git использует обобщение хеш-деревьев — направленные ациклические графы на основе хешей. В блокчейне использование хеш-деревьев продиктовано соображениями производительности, так как они делают возможным существование «легких клиентов», которые обрабатывают лишь малую часть транзакций из блокчейна.

Цифровые подписи


Цифровые подписи в блокчейнах базируются на криптографии с открытым ключом. В ней используются два ключа. Первый — закрытый ключ — нужен для формирования цифровых подписей и хранится в секрете. Второй — открытый ключ — используется для проверки электронной подписи. Открытый ключ реально вычислить на основе закрытого ключа, а вот обратное преобразование требует невозможного на практике объема вычислений, сравнимого с брут-форсом.


Существует множество различных схем криптографии с открытым ключом. Две самые популярные из них — это схемы на основе разложения на множители (RSA) и схемы на основе эллиптических кривых. Последние более популярны в блокчейнах из-за меньшего размера ключей и подписей. Например, в биткойне используется стандарт эллиптической криптографии ECDSA вместе с эллиптической кривой secp256k1. В ней закрытый ключ имеет длину 32 байта, открытый — 33 байта, а подпись — около 70 байт.


Общая идея подписей с открытым ключом выглядит следующим образом. Предположим, что Алиса хочет перевести Бобу один биткойн. Для этого она формирует транзакцию, где записывает, откуда его следует брать (указание на предыдущую транзакцию, в которой Алиса получила биткойн от кого-то еще) и кому отправить (открытый ключ Боба). Алиса знает открытый ключ Боба из сторонних источников — Боб может послать его Алисе через мессенджер или даже опубликовать его на сайте.

Затем Алиса подписывает транзакцию, используя свой секретный ключ. Любой узел в биткойн-сети может проверить, что транзакция подписана определенным открытым ключом (аутентификация), с которым до выполнения транзакции был ассоциирован один биткойн (авторизация). Если эти условия выполнены, то переведенный биткойн начинает ассоциироваться с открытым ключом Боба.

Поскольку в блокчейне нет центрального узла, который может авторизовать произвольные транзакции, безопасность системы становится децентрализованной, а вероятность успешного вмешательства в работу блокчейна снижается практически до нуля.

Таким образом, блокчейн использует цифровые подписи для аутентификации и обеспечения целостности транзакций (и иногда блоков). В случае криптовалюты процесс аутентификации означает, что потратить средства может только тот человек, которому они были посланы другой, более ранней, транзакцией. Особенность блокчейна состоит в том, что информация об аутентификации «вшита» в каждую транзакцию, а не отделена от бизнес-логики, поэтому блокчейн считается более защищенным. В обычной системе можно взломать или административно обойти механизм аутентификации и провести манипуляции с бэкэндом, а в блокчейне сделать этого не получится по определению.



P.S. В наших следующих постах мы планируем затронуть такие моменты, как смарт-контракты и алгоритмы консенсуса, а также поговорить о том, что будет означать распространение квантовых компьютеров для блокчейна.

P.P.S. Немного дополнительных источников:

  • Наш англоязычный блог

  • «C чем это едят»: что такое блокчейн
  • Подтверждение доли и доказательство выполнения работы (PoS vs PoW)
  • Смарт-контракты в биткойн-блокчейне
Поделиться с друзьями
-->

Комментарии (14)


  1. grossws
    24.04.2017 22:41
    #10189362

    Хорошая хеш-функция обеспечивает защиту от коллизий (невозможно получить два одинаковых хеша при разных начальных данных)

    Извините, конечно, но это лажа. Хэширование — сжимающее отображение, если взять все битовые последовательности длиной больше размера хэша, то коллизия будет. Хэш-функция для применения в криптографии должна обладать устойчивостью к коллизиям первого и второго рода.


    1. KatbertW
      24.04.2017 23:04
      #10189388

      Стойкость к коллизиям второго рода — это невозможность подобрать два сообщения с одинаковыми хешами. Могу быть не прав, но вроде как это то же самое?


      1. grossws
        24.04.2017 23:51
        #10189438
        +1

        Это не то же самое. Невозможность — это невозможность.


        Перебрав все сообщения длиной размера хэша и плюс одно длиной размер хэша + 1 мы получим гарантированную коллизию. Благодаря парадоксу дней рождения получим её с хорошей вероятностью ещё раньше (2^(n/2)). А устойчивость — это высокая вероятность того, что эта коллизия получается не сильно дешевле, чем перебором (2^(n/2)).


        1. andrewzhuk
          25.04.2017 00:06
          #10189454

          Игра слов из серии «адаптивный дизайн» и «отзывчивый дизайн». В англоязычной википедии требования описываются фразой "it should be difficult to find", в русскоязычной — "должно быть вычислительно невозможно".


          1. grossws
            25.04.2017 00:22
            #10189464

            Но при этом ни одно из выражений не утверждает о невозможности. Вычислительно невозможно != невозможно. Difficult to find != impossible to find.


            1. andrewzhuk
              25.04.2017 00:41
              #10189482
              +1

              Хотел ответить мемом с Дружко, но делать этого я конечно не буду.

              Кажется, есть более прикладные вопросы в этой теме, которые гораздо интереснее игры в точность перевода. Например, применимость на уровне гос. сервисов.


  1. k0sh
    24.04.2017 23:08
    #10189394

    Спасибо за статью. Как продавцы за биткоины понимают что именно я заплатил за товар?


    1. KatbertW
      24.04.2017 23:42
      #10189430
      +3

      По подписи и публичному ключу скрипта. Ключ подтверждает, что создатель транзакции имеет право распоряжаться указанной суммой. Подпись же, объединённая с публичным ключом, подтверждает, что транзакция была действительно создана владельцем указанного биткойн-адреса. Подробнее тут


    1. Gorthauer87
      25.04.2017 15:10
      #10190436
      +1

      Для этого можно использовать multisig транзакции, стороны создают специальный адрес, который состоит из публичных ключей сторон, которые участвуют в сделке, потом они отправляют транзакцию на этот адрес в качестве залога, дальше стороны формирую транзакцию, которая использует средства из залога. Эта транзакция исполняется только если обе подписи за нее будут получены.
      Таким образом стороны так или иначе должны договориться о чем-то иначе они потеряют залог.


  1. pansa
    25.04.2017 00:00
    #10189448
    -4

    Очередная статья про блокчейн в стиле «как нарисовать сову».
    В одну руку берем хэш. В другую руку берем ассиметричное шифрование… вжууух! Смотрите, какой крутой блокчейн получился, он может то-то и то-то!


  1. rule
    25.04.2017 05:30
    #10189554
    +1

    Хорошо написано, продолжайте пожалуйста.


  1. haiflive
    25.04.2017 07:21
    #10189578

    а можно немного разъяснить, Алиса передала часть суммы со своего кошелька Бобу, оба использовали свой открытый ключ, что мешает Бобу создать новую транзакцию Алисы и опустошить кошелёк Алисы? Как это регулируется в биткоин?


    1. alinatestova
      25.04.2017 09:18
      #10189680

      Есть механизм подтверждения майнерами. Он позволяет выявить несоответствия. Об этом речь пойдет в следующем материале — расскажем более подробно, не переключайтесь :)


    1. QDeathNick
      29.04.2017 01:40
      #10197066

      Для создания транзакции нужен закрытый ключ. Боб его не знает после первой транзакции.

МЕТКИ

  • Хабы
  • Теги

Разработка под e-commerce

Криптография

Информационная безопасность

Блог компании Bitfury Group

криптография

bitfury

СЕРВИСЫ
  • logo

    CloudLogs.ru - Облачное логирование

    • Храните логи вашего сервиса или приложения в облаке. Удобно просматривайте и анализируйте их.
Все публикации автора
  • Bitfury Group провела 1-ю транзакцию в Lightning Network c использованием биткойн-протокола +14

    • 21.07.2017 12:41

    «Ультимативный» блокчейн-дайджест: полезные материалы на Хабре и другие источники по теме +14

    • 18.07.2017 05:31

    «Ваш следующий шаг к блокчейну»: релиз платформы Exonum от Bitfury Group +18

    • 17.07.2017 06:50

    Рынок систем детекции и распознавания: Эмоции и «эмоциональные вычисления» +11

    • 07.07.2017 08:45

    Bitfury Group провела первую успешную multi-hop-транзакцию в сети Lightning Network +14

    • 04.07.2017 15:40

    Как запустить надстройку над биткойн-блокчейном +16

    • 20.06.2017 08:14

    Как масштабировать биткойн-блокчейн +14

    • 13.06.2017 07:18

    Что такое эксклюзивные блокчейны +8

    • 08.06.2017 07:26

    Иное применение блокчейнов: Смарт-контракты +14

    • 06.06.2017 10:12

    Подкаст «Правила игры»: бухгалтерские тонкости для технологического (и другого) бизнеса +10

    • 11.05.2017 10:01

Подписка


ЛУЧШЕЕ

  • Сегодня
  • Вчера
  • Позавчера
09:02

Загадочный «Блок №20» +22

07:01

Фишки кастдева: личный опыт +16

06:55

Я выкачал 1 000 лучших статей Хабра за год, чтобы понять, почему меня так мало плюсуют +16

08:00

Можно ли собрать сервер из игровых комплектующих +15

09:53

Три стадии развития коммуникации с клиентом в ИТ +12

07:05

Питание пульта ДУ от нестандартных источников: индукционное и не только +12

07:00

ИТ-шаманизм — когда айтишники старой волны замыкают на себя как можно больше процессов, чтобы их не уволили +11

06:43

Китайский гигант в мире мобильных игр: история NetEase +10

08:00

Осознанное возведение барьеров и сокращение взаимодействия между командами +9

06:42

Что стало с «убийцами 1С»? +9

06:10

Свой CAM для фрезеровки плат: Windows 7, станок без API и карта высот самой фрезой +9

08:27

Теневой ИИ: закрывайте поддержку, пользователи всё могут сами +7

09:49

10 000 вентилей NAND в реальном времени: как устроен симулятор в нашей игре на Rust +6

07:32

Студенты против ИИ-агентов на фоне падения прибыли ИТ-рынка на 34%: единственный способ стать востребованным инженером +6

05:30

Не можешь победить – возглавь: шаблон для учёта заявок в B2B-сервисе +6

05:30

Чем ИТ-команде заменить Jira: российские аналоги зарубежных сервисов +6

08:15

Почему Bun на Rust собирается впятеро быстрее, чем на Zig, и при чём тут линкер +5

07:12

Сколько символов в нике «Аня»? Шесть языков, три ответа, и ни одного правильного +5

06:26

Thyron — плеер, которому не нужен ЦОД +5

08:24

Техрадар в банке: от списка технологий к управляемым решениям +4

11:54

Электронный микроскоп — штука, которая позволяет увидеть атомы +97

05:46

Как меня сократили из крупной IT‑компании и через 3 месяца я стал зарабатывать больше, чем на прошлой работе +72

05:36

Почему автобус никогда не приходит вовремя, или Теорема о том, что вам не повезло +54

10:32

PaperKey — современная замена пароля +47

06:25

«Инцидент в Сасово» как зеркало современного капитализма +45

08:00

Ваш смартфон разговаривает сам с собой. Введение в UART, I2C и SPI +39

07:51

Что полезно знать про процедуру увольнения по соглашению сторон +38

07:03

И восстали люди из пепла ядрёного нейрослопа +38

13:01

Кто стоит за бэкдорами в криптокошельках Ledger? +37

07:01

Как работает акустическая камера, которая показывает окружающие звуки +34

07:57

Один профессор, один калькулятор и 475 миллионов долларов, которые Intel пришлось списать +29

09:01

Милорд, серверное железо пожрал ИИ. Арендуем Bare Metal +27

07:05

Zynq 7 020 + AD9361. Часть 1. Вводная +19

20:55

Нужно больше инстансов, Милорд +17

13:50

Дребезг цифрового сигнала: почему инвертор ведет себя как усилитель +14

13:00

Странные олдскульные технологии, которые так и не взлетели, часть 5 +12

08:00

PromptBeats: музыка из текста прямо в браузере +11

13:30

Прежде чем работать с AIDL: разбираемся, как устроен IDL +10

08:41

HireHi полтора года спустя: как мой агрегатор IT-вакансий вырос до 100 000 человек в месяц и тысячи платящих клиентов +10

08:15

От толмачей до локальных нейросетей: как я собрал приложение для перевода книг +10

13:01

Компьютер в кармане: вспоминаем легендарный Sony CLIE PEG-UX50 +55

09:01

Разбор отличий между клавиатурами под Windows и Mac +51

08:05

Раньше были основой, а потом пропали без следа. Какие мобильные ОС мы потеряли +51

09:04

Учим английский или любой другой иностранный язык с Claude Code: личный репетитор за 5 минут +38

16:02

Звёздные хороводы в галактике Hen 2–10 +26

10:30

Идеи Тома Вуджека об инженерном творчестве +26

14:30

Hotreload в Rust +22

08:00

Орбитальная свалка: как человечество рискует закрыть себе дорогу в космос +22

12:25

Пьеса про дежурство с AIOps‑агентом. Внутри 340 алертов, три ошибки и кнопка «Отмена» +18

15:30

Почти выбрались из постапокалипсиса: расцвет НКР и ядерный удар в лоре Fallout +16

13:20

J. W. — мечтатель, неудачник, законодатель моды +16

11:08

ИИ в работе: воркслоп и как его избежать +12

09:20

YPtun — один клиент вместо десятка или как мы собрали кучу протоколов в одном месте +12

07:47

Сверка таблиц в PostgreSQL, или О том, нужны ли для этого специальные утилиты +12

21:28

Замена Lens, которую целиком написала модель: что получилось и где мы проигрываем +10

06:31

Хронология языков программирования — и открытый редактор хронологий +9

15:30

SQL, NoSQL, NewSQL, Distributed SQL: как читать архитектуру СУБД +8

13:18

Методология оптимизации игр, или как 3 дня работы над тестовым стендом дало больше FPS, чем месяц написания кода +7

12:55

Возвращение в прошлое, которого у нас ещё не было +7

18:50

Приключения вайбкодера в Ворде, или Как две нейронки не осилили простенькую задачку +6

ОБСУЖДАЕМОЕ

  • «Инцидент в Сасово» как зеркало современного капитализма +45

    • 395   57000

    Как мы горим +7

    • 145   18000

    PaperKey — современная замена пароля +47

    • 113   57000

    Как меня сократили из крупной IT‑компании и через 3 месяца я стал зарабатывать больше, чем на прошлой работе +72

    • 110   21000

    Компьютер в кармане: вспоминаем легендарный Sony CLIE PEG-UX50 +55

    • 80   15000

    Инженерный штраф: как зарабатывать, оставаясь инженером +2

    • 51   13000

    Учим английский или любой другой иностранный язык с Claude Code: личный репетитор за 5 минут +38

    • 48   60000

    Раньше были основой, а потом пропали без следа. Какие мобильные ОС мы потеряли +51

    • 48   13000

    И восстали люди из пепла ядрёного нейрослопа +38

    • 37   9500

    ИТ-шаманизм — когда айтишники старой волны замыкают на себя как можно больше процессов, чтобы их не уволили +12

    • 34   3800

    Электронный микроскоп — штука, которая позволяет увидеть атомы +97

    • 33   12000

    Почему автобус никогда не приходит вовремя, или Теорема о том, что вам не повезло +54

    • 33   12000

    Спросите Итана: Если существует разумная внеземная жизнь, сможем ли мы вступить в контакт? +1

    • 30   8500

    ИИ не ускоряет разработчиков. Он увеличивает разрыв между ними +2

    • 26   6600

    Что стало с «убийцами 1С»? +9

    • 25   4800
  • Главная
  • Контакты
© 2026. Все публикации принадлежат авторам.