Утилита на Java для безопасного подписания XML с КриптоПро и ЭЦП | Блог Work Solutions
Безопасность XML: как использовать КриптоПро для создания электронной подписи в Java
ГлавнаяБлогБизнесуБезопасность XML: как использовать КриптоПро для создания электронной подписи в Java
Бизнесу16 мая 2024

Безопасность XML: как использовать КриптоПро для создания электронной подписи в Java

Фотография автора
Павел ГапоненкоBackend-разработчик

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

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

В статье расскажем, что такое ЭП, и зачем она нужна. Поделимся, для каких задач подходит КриптоПро, и какой есть стандарт создания и проверки электронной подписи в XML-документах. Рассмотрим на примере, как сделать утилиту на Java для подписания XML-документов с использованием провайдера КриптоПро. 

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

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

Подписание документов

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

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

Электронный документооборот (ЭДО) и защищенная передача данных по сети уже используется в разных организациях. Но каким образом можно обеспечить подлинность электронного документа? Для этого можно использовать электронную подпись.

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

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

Асимметричное шифрование – вид шифрования открытым и закрытым ключами. Открытым ключом сообщение шифруется, а закрытым ключом дешифруется. Открытый ключ распространяется публично и доступен для всех, кто желает отправить зашифрованные сообщения участнику. Закрытый же ключ хранится в секрете и используется только самим участником для расшифровки сообщений.

Изображение статьи
Схема работы алгоритма асимметричного шифрования

Процесс асимметричного шифрования:

  1. Получатель генерирует открытый и закрытый ключи;
  2. Открытый ключ распространяется для отправки защищенных сообщений получателю; 
  3. Отправитель шифрует сообщение открытым ключом;
  4. Получатель расшифровывает сообщение закрытым ключом.

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

Изображение статьи
Схема работы алгоритма ЭП

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

Рассмотрим само подписание документов:

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

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

КриптоПро

КриптоПро — это ведущая российская компания, которая разрабатывает крипторешения. Была основана в 1997 году и стала важным игроком в области информационной безопасности как на российском, так и на мировом рынке. 

Основные принципы работы КриптоПро:

  • Разработка и внедрение криптографических продуктов для защиты информации;
  • Безопасность данных и секретность коммуникаций;
  • Постоянное улучшение технологий согласно требованиям безопасности.

КриптоПро предлагает спектр продуктов и криптографических решений, например:

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

КриптоПро предоставляет собственный криптопровайдер «КриптоПро CSP». Криптопровайдер (Cryptographic Service Provider, CSP) – это программное или аппаратное обеспечение, предоставляющее функции криптоопераций. Сюда входят шифрование, дешифрование, создание ЭП, проверка электронной подписи, генерация случайных чисел и управление криптоключами.

CSP можно реализовать как программные библиотеки, установленные на компьютере или встроенные в операционную систему, или как аппаратные устройства: смарт-карты или криптоускорители.

Почему используем КриптоПро для работы с ЭП?

Всего бывает три типа электронных подписей:

  • простая;
  • неквалифицированная;
  • квалифицированная.

Простая ЭП представляет собой пару логин/пароль или код из СМС. Применяется для верификации личности при доступе к интернет-магазинам, государственным порталам, корпоративным сетям. Ее значимость в правовом контексте проявляется, например, в согласовании участия в ДО.

Неквалифицированная ЭП – зашифрованные данные, подтверждающие личность пользователя. Такой вид ЭП подтверждает, что подписанные данные не были изменены. Может применяться во внутреннем ДО. Создается самостоятельно или выдается в специальном удостоверяющем центре.

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

КриптоПро — приоритетный инструмент при подписании документов, так как система соответствует всем стандартам, установленным законодательством РФ для работы с КЭП.

Стандарт XMLDSig

Поговорим о подписании XML-документов. Для их подписания нужно было воспользоваться стандартом XMLDSig.

XML Digital Signature (XMLDSig) – это стандарт, разработанный для обеспечения целостности, достоверности и конфиденциальности данных в формате XML. Этот стандарт определяет синтаксис и структуру ЭП XML-документов, при этом обеспечивает безопасность в цифровой среде.

Стандарт XMLDSig основан на использовании криптометодов для создания и проверки электронных подписей XML-документов. Позволяет создавать цифровые подписи отдельных элементов XML, целых документов или фрагментов.

Изображение статьи
Пример блока электронной подписи встраиваемого в XML-документ

Посмотрим на компоненты создания и верификации цифровых подписей в XML-документах:

  • <Signature> (Подпись) – элемент содержит всю информацию, необходимую для проверки электронной подписи. Включает информацию о подписывающем ключе, алгоритме подписи, а также цифровую подпись;
  • <SignedInfo> (Информация о подписи) – в элементе размещена информация, которую подписывают, а не сама подпись. Включает информацию об алгоритме каноникализации, алгоритме хэширования, ссылках на данные, которые подписываются;
  • <CanonicalizationMethod> (Метод каноникализации) – определяет, какие модификации применяются к данным, которые подписываются перед их хэшированием. Это нужно, чтобы разные представления одних и тех же данных  приводили к одному и тому же хеш-значению. Например, с разными пробелами или порядком атрибутов;
  • <SignatureMethod> (Метод подписи) – определяет алгоритм, который работает при формировании цифровой подписи. Например, может использоваться алгоритм RSA, работающий на основе ключей шифрования и расшифровки;
  • <Reference> (Ссылка на данные) – определяет данные, которые подписываются. Содержит URI, а также информацию о методе хэширования и алгоритме каноникализации, применяемых к этим данным;
  • <DigestMethod> (Метод хэширования) – указывает алгоритм хэширования, который нужен для формирования дайджеста (хеш-значения) подписываемых данных;
  • <DigestValue> (Значение дайджеста) – содержит результат хэширования подписываемых данных;
  • <Transforms> (Преобразования) – определяет преобразования, которые нужно применить к данным перед вычислением хэша (дайджеста). Такими преобразованиями могут быть: удаление элементов XML, изменение их порядка, нормализация пробелов и другие манипуляции с данными, чтобы обеспечить их однородность перед подписанием;
  • <KeyInfo> (Информация о ключе) – предоставляет информацию о ключе, который используется для создания подписи. Может содержать открытый ключ подписчика, сертификаты, идентификаторы и другую открытую информацию о ключе.

Реализация стандарта XMLDSig — важный аспект для создания функционала проверки целостности и подлинности данных электронной подписи.

Как мы создали утилиту подписания XML-документов

«Поток.Диджитал» выступил заказчиком на разработку функционала подписания ЭП XML-документов. Компания выступает как управляющий оператор инвестиционной платформы, что позволяет частным лицам инвестировать средства в российские малые предприятия через выдачу займов.

О клиенте

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

О проекте

Цель проекта — реализовать функционал подписания документов XML ЭП с использованием провайдера от компании КриптоПро для дальнейшей интеграции с Альфа-банком посредством XML-запросов.

По требованию клиента утилите подписания XML-документов нужно иметь схожий функционал с утилитой cryptcp в части создания электронной подписи, которую предоставляет криптопровайдер КриптоПро CSP. 

Реализация криптографической утилиты на Java

Для проекта нужно было реализовать консольное приложение на языке Java, которое должно содержать функционал подписания входящего документа XML с помощью ЭП. Также в приложении должна быть возможность указывать критерии поиска сертификатов (КПС) в операционной системе пользователя утилиты.

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

Кроме выполнения требований клиента, нужно было заложить расширяемую архитектуру XML утилиты, то есть реализовать возможность простого добавления новых консольных команд в приложение.

Для работы с аргументами командной строки выбрали библиотеку JCommander. Позволяет представить консольную команду в виде Java-класса для работы с параметрами в программе.

Изображение статьи
Пример описания аргументов команды посредством класса в JCommander

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

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

Изображение статьи
Пример обработчика команды

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

Для того, чтобы реализовать создание электронной подписи в Java-приложении, нужно было также подключить библиотеки КриптоПро Java Cryptography Provider. JCP – это программное обеспечение, которое предоставляет криптографические функции и возможности для работы с ЭП в среде Java.

Сложность была в упаковке криптографических библиотек КриптоПро в общий JAR-файл утилиты, так как такие библиотеки не хранятся в разных центральных репозиториях. Их необходимо подключать локально. Справиться с задачей помогло внедрение Spring Boot. Фреймворк корректно упаковал все зависимости в один архив. При разработке утилиты использовали язык разработки Java 17, фреймворк Spring Boot 3.2.2.

Подписание документа должно соответствовать стандарту XMLDSig. Для реализации стандарта на языке Java воспользовались библиотекой Apache Santuario. Библиотека предоставляет набор классов и методов для работы с XMLDSig, включая создание ключевых пар, генерацию подписей, верификацию подписей, управление сертификатами.

Изображение статьи
Пример вызова утилиты подписания документов XML

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

Результат

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

Заключение

Электронная подпись стала важной частью ЭДО и передачи информации. Цифровые подписи обеспечивают достоверность и целостность передаваемых данных.

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

Язык Java в качестве инструмента для работы с криптографией дает разные преимущества. Например, платформенная независимость, надежность, набор криптографических библиотек, а точнее библиотеки для работы с XML документами. Java позволяет работать с разными криптопровайдерами в зависимости от требований. 

72
15

Другие статьи

Ко всем статьям
Фоновое изображение: четверть круга закрыват часть круга

Интересные статьи и кейсы
от Work Solutions

Нажимая кнопку «Подписаться», я даю согласие на обработку персональных данных

Спасибо за подписку!

Фоновое изображение: верхний полукруг