• 14721
  • 120
  • 7
Нравится блог?
Подписывайтесь!

Подпись XML-документов несколькими ЭЦП

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


Есть три основных алгоритма подписания:
  • detached - подпись хранится отдельно от структуры подписываемого документа
  • enveloping - подписываемые данные находятся внутри XML-структуры, описывающей подпись
  • enveloped - XML-структура, описывающая подпись, добавляется внутрь подписываемых данных

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

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

Что же касается проверки валидности подписанного документа, возникли трудности - существующий функционал сообщал о несоответствии подписи содержимому документа, в случае, если количество подписей превышало 1. Немного исследований выяснили следующее: существующий функционал находил в XML-документе первую подпись и пытался сверить данные с ней. Как оказалось, первая подпись была неверна потому, что после её добавления в документ, сам документ изменялся - в него добавлялись ещё подписи. Общий механизм примерно следующий: первая подпись удостоверяет непосредственно данные документа; вторая подпись удостоверяет данные документа, подписанные первой подписью, т.е. подписывается сам документ и первая подпись; соответственно третья подпись удостоверяет данные документа и первые две подписи и т.д. (напоминаю, что описывается алгоритм enveloped). При этом каждая последующая подпись делает невалидной предыдущую, т.к. изменяет структуру подписанного XML-документа. Возникает вопрос - как же в таком случае осуществлять проверку подписей, ведь если нельзя проверить ВСЕ подписи, зачем их вообще ставить в таком количестве? Ответ на самом деле не так уж и сложен - следует осуществлять последовательную сверку подписей, начиная с последней. При этом, после проверки каждой наиболее "внешней" подписи, её следует удалять из структуры документа, перед переходом к проверке следующей (с конца списка) подписи. Т.е., если у документа, например, 3 подписи, сначала сверяем третью, удаляем её из документа, сверяем вторую, удаляем, и наконец сверяем последнюю оставшуюся - то бишь первую. С учётом того, что современные программные средства создают из исходного XML-текста некоторую объектную структуру (обычно, соответствующую DOM - Document Object Model), такие манипуляции выполняются очень просто и не затрагивают к тому же исходный текст.

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

Совсем кратко так и не получилось...

vovan_sidorytch
20 октября 2010, 15:56
1835

Загрузка...
Loading...

Комментарии

Сейчас тоже работаю с Xml и электронными подписями и сталкиваюсь с подобными проблемами, поэтому интересно было почитать. Мы используем именно алгоритм detached: подпись хранится в xml документе, но подписывает не весь документ, а только определенный раздел.
Практически все примеры, найденные мной в сети, описывали механизм подписания enveloped, я не смог найти ни одного примера detached. Но, поразбиравшись немного в них, и поняв основные действия, выполняемые функциями обработки XML Signature в связке с DOM, я понял какие (небольшие) изменения следует внести, чтобы получить detached подпись. Также разобрался как указать какую именно часть XML-документа подписывать.

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

Оставьте свой комментарий

Спасибо за открытие блога в Yvision.kz! Чтобы убедиться в отсутствии спама, все комментарии новых пользователей проходят премодерацию. Соблюдение правил нашей блог-платформы ускорит ваш переход в категорию надежных пользователей, не нуждающихся в премодерации. Обязательно прочтите наши правила по указанной ссылке: Правила

Также можно нажать Ctrl+Enter

Популярные посты

Мой дом – не гостиница. Я не останавливаюсь у своей родни, потому что знаю, что это такое

Мой дом – не гостиница. Я не останавливаюсь у своей родни, потому что знаю, что это такое

Наступил долгожданный момент и мы смогли заселиться в собственную квартиру. А потом началось... Все знакомые, родственники, даже коллеги и соседи родителей вспомнили о нашем существовании.
Idealovnet
14 окт. 2017 / 20:38
  • 8882
  • 82
Работа на EXPO. «Улыбайтесь, вы – лица Казахстана»

Работа на EXPO. «Улыбайтесь, вы – лица Казахстана»

Продление перерывов, втыки от менеджеров, борьба за стенды, кучкования, как мы друг-друга прикрывали, защищали от гостей. Все эти события доставляли радость, и каждый день на работу я приходила...
madiNAtty
14 окт. 2017 / 22:34
  • 6120
  • 23
О проститутках, ЗППП и других сексуальных страстях

О проститутках, ЗППП и других сексуальных страстях

У меня обширный сексуальный опыт, и я этим не хвастаюсь. Будь у меня возможность, променял бы это всё на одного партнёра. Но так как с личной жизнью не заладилось, а секс я очень люблю, то приходилось изворачиваться.
bez_prav
18 окт. 2017 / 18:01
Я четко помню тот день, когда мне позвонили друзья и сообщили: «Она выходит замуж»

Я четко помню тот день, когда мне позвонили друзья и сообщили: «Она выходит замуж»

У нас была особенная атмосфера, мы постоянно были вместе, читали треки, летом часто поднимались в горы. Гуляли пешком по ночному городу, иногда до утра. Снимали хату и представляли совместную жизнь...
Dominator-kz
14 окт. 2017 / 22:29
Отчего в Казахстане предвзятое отношение к отечественному продукту?

Отчего в Казахстане предвзятое отношение к отечественному продукту?

Вы когда-нибудь пользовались казахстанской косметикой? Я тоже нет, поэтому сразу же откликнулась на приглашение своего фейсбук-френда протестировать отечественные крема… из Степногорска.
Shimanskaya
16 окт. 2017 / 11:32
  • 2782
  • 30
Я помню тот день, когда мне позвонили друзья и сообщили: «Она выходит замуж». Часть 2

Я помню тот день, когда мне позвонили друзья и сообщили: «Она выходит замуж». Часть 2

Я знал дату свадьбы. За неделю до свадьбы в соцсети "Вконтакте" на все мои последние фото, был проставлен лайк с её профиля. Сердце забилось сильнее. В душе загорелась наивная, крошечная надежда.
Dominator-kz
17 окт. 2017 / 15:41
Мой парень – «тиран». Почему я вступила в такие отношения?

Мой парень – «тиран». Почему я вступила в такие отношения?

История из моей жизни. Я вспоминаю эти отношения и сама не могу понять - как так произошло? А дело в том, что вы и сами не заметите. Это наступает плавно и динамично.
Altynai_JA
18 окт. 2017 / 14:17
«Автобусная неделя». Выдержит ли аким Шымкента давку в общественном транспорте?

«Автобусная неделя». Выдержит ли аким Шымкента давку в общественном транспорте?

Аким Шымкента Габидулла Абдрахимов нашёл решение накопившихся проблем городского транспорта. Все ключевые работники акимата некоторое время будут сами ездить на автобусах.
openqazaqstan
18 окт. 2017 / 10:53
  • 1675
  • 32
Аркадий Волож привел в Казахстан «Яндекс.Лицей». Плакать или радоваться?

Аркадий Волож привел в Казахстан «Яндекс.Лицей». Плакать или радоваться?

"Яндекс.Лицей" зашел в казахстанские школы. План - учить бесплатно программированию, формировать себе кадры и выйти на мощность 10 тысяч школьников в год.
Zhumanova
18 окт. 2017 / 8:36
  • 1466
  • 12