Открыть сервис

XML Digital Signature

XML Digital Signature (XMLDSig) — это стандарт цифровой подписи, предназначенный для обеспечения целостности, аутентичности и неотказуемости данных, представленных в формате XML. Он определяет синтаксис и правила создания, представления и проверки электронной подписи, которая может быть применена как к части XML-документа, так и к произвольным данным, не связанным с XML. Стандарт разработан Консорциумом Всемирной паутины (W3C) и Рабочей группой по инженерным проблемам Интернета (IETF) в 2002 году (рекомендация W3C «XML-Signature Syntax and Processing» версии 1.0, RFC 3275). XMLDSig является ключевым компонентом многих веб-сервисов, систем электронного документооборота и протоколов безопасности, таких как SAML, WS-Security и XAdES.

История и развитие

Разработка XMLDSig началась в конце 1990-х годов в ответ на потребность в стандартизированном способе подписания XML-данных. До появления стандарта существовали проприетарные решения, что затрудняло интероперабельность. В 1999 году W3C и IETF сформировали совместную рабочую группу, которая к 2001 году завершила черновую версию спецификации. Окончательная рекомендация W3C была опубликована 12 февраля 2002 года, а IETF закрепила её как RFC 3275 в марте того же года.

В 2008 году вышла вторая версия стандарта — XML Signature 2.0 (W3C Recommendation, 10 апреля 2008), которая устранила некоторые недостатки первой версии, ввела поддержку новых алгоритмов хеширования (SHA-2) и упростила обработку. Однако первая версия остаётся наиболее широко распространённой. В 2013 году была опубликована поправка «XML Signature Best Practices» (W3C Working Group Note), содержащая рекомендации по безопасному использованию стандарта в свете обнаруженных уязвимостей.

Основные принципы и структура

XMLDSig отличается от традиционных цифровых подписей (например, PKCS#7/CMS) тем, что подпись сама является XML-документом или элементом, который может быть встроен в подписываемый документ или передан отдельно. Подпись может быть применена к произвольным данным, включая части XML-документа, внешние файлы или даже целые документы.

Элемент <Signature>

Корневым элементом подписи является <Signature>, который содержит следующие дочерние элементы:

  • <SignedInfo> (обязательный) — содержит информацию о том, что именно подписывается, какие алгоритмы используются и как преобразуются данные. Включает:
  • <CanonicalizationMethod>алгоритм канонизации XML (например, http://www.w3.org/TR/2001/REC-xml-c14n-20010315`), который приводит документ к единому формату перед подписанием, чтобы избежать влияния незначительных синтаксических различий (пробелы, порядок атрибутов).
  • <SignatureMethod> — алгоритм подписи (например, RSA-SHA256, ECDSA-SHA256).
  • <Reference> (один или несколько) — ссылка на подписываемые данные. Содержит:
  • URI — идентификатор ресурса (может быть XPath-выражением для части XML, идентификатором фрагмента или URL для внешнего файла).
  • <DigestMethod> — алгоритм хеширования (например, SHA-256).
  • <DigestValue> — вычисленное хеш-значение подписываемых данных.
  • <Transforms> (необязательно) — список преобразований, которые применяются к данным перед вычислением хеша (например, канонизация, XPath-фильтрация, Base64-декодирование).
  • <SignatureValue> (обязательный) — собственно цифровая подпись, вычисленная над канонизированным содержимым элемента <SignedInfo>.
  • <KeyInfo> (необязательный) — информация о ключе подписи. Может содержать:
  • Сертификат X.509 (<X509Data>).
  • Открытый ключ (<KeyValue>).
  • Идентификатор ключа (<KeyName>).
  • Ссылку на внешний источник ключа (<RetrievalMethod>).
  • Зашифрованный ключ.
  • <Object> (необязательный) — может содержать произвольные данные, включая сам подписываемый документ (в случае встроенной подписи) или дополнительные атрибуты (например, время подписи).

Типы подписей

XMLDSig поддерживает три основных типа подписей в зависимости от расположения относительно подписываемых данных:

  1. Enveloped Signature (вложенная подпись) — подпись помещается внутрь подписываемого XML-документа. При этом элемент <Signature> является дочерним по отношению к корневому элементу документа. Для исключения самой подписи из вычисления хеша используется преобразование http://www.w3.org/2000/09/xmldsig#enveloped-signature`. Этот тип удобен для документов, которые должны быть самодостаточными.
  1. Enveloping Signature (обертывающая подпись) — подписываемые данные помещаются внутрь элемента <Object> внутри самой подписи. Подпись «оборачивает» данные. Этот тип используется, когда подпись и данные должны передаваться вместе, но подпись не должна изменять структуру исходного документа.
  1. Detached Signature (отделенная подпись) — подпись хранится отдельно от подписываемых данных. Ссылка на данные указывается в атрибуте URI элемента <Reference>. Данные могут находиться в том же документе (по ID), в другом файле или быть доступны по URL. Этот тип наиболее гибок и часто используется в протоколах (например, SAML).

Канонизация XML

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

Алгоритмы и безопасность

Стандарт поддерживает широкий набор криптографических алгоритмов. В первой версии обязательными были RSA-SHA1 и DSA-SHA1. Вторая версия добавила RSA-SHA256, ECDSA, HMAC-SHA256 и другие. Рекомендуется использовать алгоритмы с длиной ключа не менее 2048 бит для RSA и хеши SHA-256 или выше.

Уязвимости и атаки

XMLDSig не лишён проблем безопасности. Наиболее известные атаки включают:

  • XML Signature Wrapping (XSW) — атака, при которой злоумышленник модифицирует структуру XML-документа, перемещая элемент <Signature> в другое место или добавляя новые элементы, но сохраняя ссылку на подписанную часть. Приложение, проверяющее подпись, может подтвердить её валидность, но затем обработать неподписанные (подменённые) данные. Эта атака особенно опасна для веб-сервисов (например, SOAP, SAML).
  • XXE-атаки — использование внешних сущностей в процессе обработки XML может привести к утечке данных или отказу в обслуживании.
  • Атаки на канонизацию — манипуляции с пространством имён или кодировкой могут привести к расхождению между подписанным и проверяемым содержимым.

Для защиты от XSW рекомендуется использовать строгую валидацию структуры документа, проверять, что подпись относится к ожидаемому элементу, и применять ограничения на XPath-выражения.

Применение

XMLDSig широко используется в различных областях:

  • Веб-сервисы и SOAP — подпись сообщений SOAP для обеспечения аутентичности и целостности. Стандарт WS-Security использует XMLDSig как один из основных механизмов.
  • SAML (Security Assertion Markup Language) — подпись утверждений (assertions) и запросов/ответов аутентификации. SAML-токены часто содержат вложенные или отделённые подписи XMLDSig.
  • XAdES (XML Advanced Electronic Signatures) — стандарт, расширяющий XMLDSig для соответствия требованиям европейского регламента eIDAS. XAdES добавляет информацию о времени, статусе сертификата и другие атрибуты, обеспечивающие долговременную валидность.
  • Электронный документооборот — во многих государственных и корпоративных системах (например, в России — система «Госуслуги», «1С-Документооборот») подпись XML-документов реализована на основе XMLDSig или его расширений (XAdES).
  • OpenID Connect и OAuth 2.0 — в некоторых реализациях для подписи токенов.
  • Электронные подписи в России — ГОСТ-алгоритмы (ГОСТ Р 34.10-2012, ГОСТ Р 34.11-2012) интегрированы в XMLDSig через стандарт XAdES, который адаптирован для российских криптографических требований.

Сравнение с другими стандартами

XMLDSig часто сравнивают с другими форматами цифровых подписей:

  • PKCS#7 / CMS (Cryptographic Message Syntax) — более старый и универсальный стандарт, не привязанный к XML. CMS проще в реализации, но не поддерживает подпись частей документа и канонизацию. XMLDSig же лучше интегрируется в XML-экосистему.
  • JSON Web Signature (JWS) — современный стандарт для JSON-данных. JWS проще и легче, но не подходит для XML-документов.
  • PGP (Pretty Good Privacy) — используется для электронной почты и файлов, не ориентирован на XML.

XMLDSig остаётся стандартом де-факто для подписи XML-данных, несмотря на появление более простых альтернатив.

Интересные факты

  • Первая версия XMLDSig была разработана за рекордные два года, что было обусловлено острой потребностью индустрии.
  • Стандарт позволяет подписывать не только XML, но и любые другие данные (например, изображения или бинарные файлы) через преобразование Base64.
  • Атака XML Signature Wrapping была впервые описана в 2005 году и до сих пор остаётся актуальной для плохо спроектированных систем.
  • В России XMLDSig адаптирован под национальные стандарты криптографии через профиль XAdES-GOST, который является обязательным для государственных информационных систем.

Источники

  • W3C Recommendation «XML-Signature Syntax and Processing» (Version 1.0, 2002)
  • W3C Recommendation «XML Signature Syntax and Processing Version 2.0» (2008)
  • RFC 3275 — (Extensible Markup Language) XML-Signature Syntax and Processing
  • W3C Working Group Note «XML Signature Best Practices» (2013)
  • Стандарт XAdES (ETSI TS 101 903)
  • Документация по безопасности веб-сервисов (OASIS WS-Security)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →