Тип подписания хеш что это

Обновлено: 30.06.2024

Одно из полезных применений асимметричного шифрования — работа с электронной подписью. Рассказываем, как устроена ЭП изнутри и где она применяется.

Что такое электронная подпись

Электронная подпись — это технология, которая помогает подтвердить подлинность электронного документа: договора, справки, выписки или чего-то ещё.

Если упрощённо, работает так:

👉 Есть некий документ, подписанный ЭП

👉 С помощью специальной программы можно проверить подлинность этой подписи и документа

✅ Если программа говорит, что всё окей, то мы можем быть уверены: документ подписал именно тот, кто в нём указан; и с момента подписания в документе ничего не изменилось.

❌ Или программа может сказать, что подпись не совпала. Это значит, что либо документ подписал другой человек, либо после подписания кто-то изменил этот документ (например, дописал ноль в стоимость контракта). Так мы поймём, что этому документу нельзя доверять.

С технической точки зрения ЭП — небольшой файлик, который прилагается к искомому документу. Файлик пересылается вместе с основным документом, его можно передавать по открытым каналам связи, в нём нет ничего секретного.

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

Основа ЭП — асимметричное шифрование

Как работает: сертификаты

Электронная подпись состоит из двух принципиальных частей:

  1. Сертификат для удостоверения подписывающего.
  2. Криптографическая часть для проверки подлинности документа.

Грубо говоря, ЭП должна гарантировать, что документ подписали именно вы и что вы подписали именно этот документ.

В сертификате хранятся данные о владельце подписи:

  • кто владелец этой подписи;
  • открытый ключ для проверки подписи;
  • когда заканчивается срок действия подписи;
  • какого уровня документы можно подписывать этой подписью;
  • кто выдал сертификат;
  • и другие служебные данные.

Но смысл сертификата не в том, что там хранятся эти данные, а в том, кто эти данные туда положил. В России сертификаты и ЭП выдают специальные удостоверяющие центры — это компании, которые гарантируют, что сертификат выдаётся именно тому, кто в этом сертификате указан.

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

Как работает: алгоритмы шифрования

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

Проблема в том, что ЭП основана на алгоритмах асимметричного шифрования, а их много: разложение на простые множители, дискретное логарифмирование, эллиптические кривые и множество других. Ключ из одного алгоритма не подойдёт для использования в другом, поэтому в России договорились использовать стандарт шифрования ГОСТ Р 34.10-2012, основанный на эллиптических кривых. Все государственные органы работают только с таким алгоритмом и не принимают другие ЭП.

Это значит, что нам нужен специальный софт, в котором уже есть этот алгоритм. Чаще всего используют КриптоПРО, реже — ViPNet CSP. С помощью этих программ можно подписать документы и проверить сертификаты на подлинность.

Принцип работы электронной подписи

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

Разберём по шагам:

  1. В удостоверяющем центре вы получаете сертификат и ключ электронной подписи. Это закрытый ключ, который передавать никому нельзя. Открытый же ключ хранится в самом сертификате, который прикладывается к каждому документу и доступен всем.
  2. Берёте нужный документ и получаете его криптографический хеш. Хеш — это небольшая строка, которая представляет собой «цифровой отпечаток» файла. У каждого файла с уникальным набором битов будет уникальный хеш, причём он всегда одинаковой длины. Подробнее о хешах мы писали, когда разбирали скандал с паролями Фейсбука.
  3. Шифруете этот хеш своим закрытым ключом. Полученный результат шифрования добавляете к исходному документу.
  4. Туда же добавляете сертификат, чтобы все могли проверить и убедиться, что документ подписали вы.

А что если подменят сам сертификат?

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


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

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

Неотказуемость – подписавшее документ лицо не может утверждать, что это сделал кто-то другой;

Целостность – внесение исправлений в уже подписанный документ должно нарушать подпись;

Авторство – электронная подпись должна быть жёстко закреплена за определённым физическим или юридическим лицом.

Эти базовые принципы и делают ЭП эффективной и безопасной в использовании.

Немного теории

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

Применение хэш-функций

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

Подробная схема с применением хэш-функции

Подробная схема с применением хэш-функции

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

Что же может пойти не так?

И действительно, в теории взломать или подделать такую подпись можно несколькими способами. Самый лакомый способ для взломщика-криптоаналитика – это по открытому ключу угадать закрытый. Тогда злоумышленнику сразу открываются сказочные перспективы – ведь он сможет действовать от лица истинного владельца подписи и даже управлять его имуществом. Однако обычно такой взлом не возможен ввиду того, что подбор закрытого ключа по открытому – вычислительно нерешаемая задача. При генерации пары ключей широко применяются факторизация или дискретное логарифмирование, что оставляет взломщику мало надежды. Конечно можно попробовать подобрать закрытый ключ полным перебором, но при достаточно большом размере ключей такая возможность отпадает.

Ещё одно уязвимое место – это хэш-функция. Здесь возможны сразу несколько направлений атак. Если алгоритм хэширования не достаточно надёжный, то взломщик может подобрать какой-нибудь свой документ, применение хэш-функции к которому даст тот же результат, что и её применение к исходному документу. Или же злоумышленник может сгенерировать два документа, дающие одинаковый хэш, после чего при необходимости сможет подменить один документ другим. Названные ситуации считаются коллизиями хэш-функций. Однако жизнь взломщика хэш-функции всё же не так легка: мало того, что подставной документ должен представлять из себя читаемый текст, а не быть бессмысленным набором бит, так еще и придумано достаточно криптостойких алгоритмов хэширования. Для примера, надёжными на момент написания статьи являются SHA-3, BLAKE2, семейство JH или отечественный «Стрибог» (он же ГОСТ 34.11-2018).

Подключаем человеческий фактор, бюрократию и частные организации

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


В России получение ЭП регулируется законом № 63-ФЗ «Об электронной подписи». Для её оформления нужно получить сертификат от удостоверяющего центра (УЦ) на выбор. В УЦ нужно предоставить необходимые документы и заплатить некоторую сумму, после чего забрать свой сертификат и заветный eToken с закрытым ключом.

Вот на получении сертификатов-то и возникает простор для всевозможных махинаций. Все УЦ являются коммерческими организациями, они обязательно аккредитованы Министерством цифрового развития и имеют лицензию от ФСБ. Однако чего не сделаешь ради прибыли - для УЦ порой желания клиентов выше установленных правил выдачи сертификата. Например, из-за этого сегодня возможно получить ЭП на другое лицо, пользуясь утечками персональных данных или некомпетентностью УЦ. Это приводит к довольно печальным последствиям – вплоть до переоформления квартиры или регистрации фиктивных организаций с целью взятия кредитов. Данные способы подделки подписей не требуют даже знания криптографии, достаточно лишь воспользоваться особенностями сертифицирования ЭП в России.

Заключение

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

Итак, все чаще в кругах, работающих с документами все чаще звучат слова «электронный документ» и, связанное с ним почти неразрывно «электронная цифровая подпись», иначе — ЭЦП.

Данный цикл статей предназначен для того, чтобы раскрыть «тайное знание» о том, что это такое, когда и как это можно и нужно использовать, какие есть плюсы и минусы.

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


Зачем нам вообще что-то подписывать? Естественно, чтобы удостоверить, что мы ознакомились с содержимым, согласны (а иногда наоборот, не согласны) с ним. А электронная подпись еще и защищает наше содержимое от подмены.

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

Итак, мы читаем файлик в память, хэшируем прочитанное. И что, уже получаем ЭЦП? Почти. Наш результат с большой натяжкой можно назвать подписью, но, все же, полноценной подписью он не является, потому что:

1. Мы не знаем, кто сделал данную подпись

2. Мы не знаем, когда была сделана подпись

3. Сама подпись не защищена от подмены никак.

4. Ну и да, хэш функций много, какая из них использовалась для создания этого конкретного хэша?

Поэтому применять к хэшу слово «подпись» еще нехорошо, будем называть его дальше просто хэш.

Вы посылаете ваш файл другому человеку, допустим, по почте, будучи уверенными, что он точно получит и прочитает именно то, что вы послали. Он же, в свою очередь, тоже должен хэшировать ваши данные и сравнить свой результат с вашим. Если они совпали — все хорошо. Это значит что данные защищены? Нет.
Ведь хэшировать может кто угодно и когда угодно, и вы никогда не докажете, что он хэшировал не то, что вы послали. То есть, если данные будут перехвачены по дороге злоумышленником, или же тот, кому вы посылаете данные — не очень хороший человек, то данные могут быть спокойно подменены и прохэшированы. А ваш получатель (ну или вы, если получатель — тот самый нехороший человек) никогда не узнает, что он получил не то, что вы отправляли, или сам подменил информацию от вас для дальнейшего использования в своих нехороших целях.
Посему, место для использование чистой хэш функции — транспорт данных в пределах программы или программ, если они умеют общаться между собой. Собственно, с помощью хэш функций вычисляются контрольные суммы. И эти механизмы защищают от случайной подмены данных, но не защищают от специальной.

Но, пойдем дальше. Нам хочется защитить наш результат хеширования от подмены, чтобы каждый встречный не мог утверждать, что это у него правильный результат. Для этого самое очевидное что (помимо мер административного характера)? Правильно, зашифровать. А ведь с помощью шифрования же можно и удостоверить личность того, кто хэшировал данные! И сделать это сравнительно просто, ведь есть ассиметричное шифрование. Да, оно медленное и тяжелое, но ведь нам всего-то и надо — зашифровать маленькую последовательность байт. Плюсы такого действия очевидны — для того, чтобы проверить нашу подпись, надо будет иметь наш открытый ключ, по которому личность зашифровавшего (а значит, и создавшего хэш) можно легко установить.
Суть этого шифрования в следующем: у вас есть закрытый ключ, который вы храните у себя. И есть открытый ключ. Открытый ключ вы можете всем показывать и раздавать, а закрытый — нет. Шифрование происходит с помощью закрытого ключа, а расшифровывание — с помощью открытого.
Приводя аналогию, у вас есть отличный замок и два ключа к нему. Один ключ замок открывает (открытый), второй — закрывает (закрытый). Вы берете коробочку, кладете в нее какую-то вещь и закрываете ее своим замком. Так, как вы хотите, чтобы закрытую вашим замком коробочку открыл ее получатель, то вы открытый, открывающий замок, ключик спокойно отдаете ему. Но вы не хотите, чтобы вашим замком кто-то закрывал коробочку заново, ведь это ваш личный замок, и все знают, что он именно ваш. Поэтому закрывающий ключик вы всегда держите при себе, чтобы кто-нибудь не положил в вашу коробочку мерзкую гадость и не говорил потом, что это вы ее положили и закрыли своим замком.

И все бы хорошо, но тут сразу же возникает проблема, а, на самом деле, даже не одна.

1. Надо как-то передать наш открытый ключ, при этом его должна понять принимающая сторона.

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

3. Мало того, что ключ надо связать с нами, надо еще и понять, какой зашифрованный хэш каким ключом расшифровывать. А если хэш не один, а их, скажем, сто? Хранить отдельный реестр — очень тяжелая задача.

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

Как водится у людей, к чему-то единому прийти так и не смогли, и образовалось два больших лагеря — формат OpenPGP и формат S/MIME + X.509. Но об этом уже в следующей статье.

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

Попробую сегодня на пальцах рассказать, что это такое и зачем это нужно.

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

Хэш еще называют свёрткой, в этом очень точно описывается суть этой математической операции.

Мы все знаем, что любая информация в цифровом виде представляет собой последовательность чисел. Блок информации может быть очень большим - это может быть текст "Войны и мира", или вообще вся Санта-Барбара. А может быть очень коротким. В современном мире громадное количество блоков информации, и часто нужен какой-то простой способ уникально идентифицировать каждый блок. Или, как еще иногда говорят, получить "отпечаток текста".

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

Берем огромный роман "Война и мир" и получаем от него короткий, тридцатидвухбайтный хэш (256 бит). И этот хэш (результат вычисления хэш-функции) уникально идентифицирует текст "Войны и мира".

Представим, допустим, что кто-то взял и изменил этот текст. Например, изменил одну букву где-то в середине романа. Снова вычисляем хэш от нового, измененного текста. Полученное значение будет очень сильно отличаться от прошлого. Т.е. новый текст даст другой хэш, пусть даже изменилась всего одна буква!

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

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

Как теперь сравнить два разных текста? А просто вычисляем хэш от каждого. Если хэши разные - то и исходные тексты разные. Даже если разница в одном символе в огромном романе. Кстати, в программировании так время от времени делают: чтобы не париться с посимвольным сравнением огромных текстов, просто сравнивают вычесленные от них хэши. Или чтобы организовать хранение данных по парам "ключ-значение", используют хэш-таблицу.

Иногда на некоторых сайтах можно увидеть интересные надписи, вроде "контрольная сумма MD5". Смысл такой: скачиваете файл, но вдруг возникает сомнение, а не подменил ли кто-то файл? Проверить это можно разными способами, один из них - вычислить контрольную сумму. Контрольная сумма, кстати - это один из способов хэширования, смысл практически тот же самый. Из большого текста получить маленькую числовую характеристику. А MD5 - это название конкретного алгоритма хэширования.

Так вот, скачиваете файл, вычисляете от него хэш MD5 (есть утилиты для этого) и сравниваете с тем, что на сайте написано. Совпадает? Все отлично! Нет? Упс. Или недокачался, или кто-то файл подменил. Кстати, антивирусы имеют базу данных, в которой для каждого системного файла есть его хэш. Если на компьютере пользователя у системного файла другой хэш - это значит, что файл поврежден и заражен. И иногда антивирус так и говорит: "не совпадают контрольные суммы системных файлов" или "не совпадают хэши файлов".

Как рассчитывают хэш? Можно придумать самый простой алгоритм вроде такого. Берем исходный блок чисел, и просто последовательно перемножаем их друг на друга. Когда число становится слишком большим (превышает размер требуемого хэша) - отрезаем лишнее . И дальше перемножаем. Снова слишком большое число? Снова отрезаем . В итоге получится какое-то число, которое и будет хэшем. Если в исходной последовательности байт (в исходном тексте) изменить одно значение - то произведение, скорее всего, изменится, и изменится (скорее всего) наше обрезаное значение. Это пример примитивной хэш-функции. На практике никто таким алгоритмом не пользуется, потому что он не стойкий к ряду неприятностей. Например, если просто поменять местами два символа рядом - произведение не изменится. А текст-то изменился!

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

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

Чтобы представить себе, как вообще такое возможно - каждому тексту поставить в соответствие уникальную числовую характеристику, я в свое время придумал себе такую картинку. Допустим, каждый текст, написаный когда-либо человеком, имеет порядковый номер. Вот пусть этот поряковый номер и будет уникальной характеристикой (хэшем) текста. Если размер хэша у нас 256 бит (большинство алгроитмов генерируют хэш от 140 до 256 бит), то с помощью числа такого размера можно пронумеровать каждый электрон во вселенной! Потому что во вселенной всего 10 в степени 80 электронов, а это сопоставимо с двойкой в степени 256. Т.е. понятно, что человечесво не способно даже близко наделать столько текстов; так что для каждого из них найдется какой-нибудь отдельный номер из этого огромного количества возможных номеров. Так что это возможно - каждому тексту дать уникальный хэш.

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

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

Подписывайтесь на канал "Технологии Денег" в Яндекс.Дзен и Телеграм ! У меня много интересного материала!

Читайте также: