JAXBContext и Marshaller меняют порядок пространства имен XML - PullRequest
2 голосов
/ 28 августа 2010

У меня есть такая строка кода:

StringWriter writer = new StringWriter(); 
JAXBContext jc = JAXBContext.newInstance(namespace);
Marshaller marshaller = jc.createMarshaller();        
marshaller.marshal(input, writer);

Когда namespace = "nfpa:nfpares". У меня есть сгенерированный контент, подобный этому:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceRequest xmlns:ns2="nfpares" xmlns="nfpa">
...
</ServiceRequest>

но каким-то образом в другой части библиотеки (которую я не контролирую) разработчик также использует JAXBContext и то же пространство имен, но сгенерированный контент:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceRequest xmlns="nfpa" xmlns:ns2="nfpares">
...
</ServiceRequest>

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

спасибо

1 Ответ

4 голосов
/ 28 августа 2010

При проверке криптографической подписи на xml вам нужно работать с xml в канонической форме.Существует множество различных возможностей сериализации для одной и той же структуры XML, которые одинаковы с анализатором XML.Например, <a/> против <a></a>, &#160; против &#xA0; или порядок атрибутов и пространств имен.Существует стандарт для канонизации XML , который описывает следующее преобразование:

Канонической формой документа XML является физическое представление документа, созданного методом>, описанным в данной спецификации.,Изменения сведены в следующий список:

  • Документ закодирован в UTF-8
  • Разрывы строк нормализованы к #xA на входе, перед синтаксическим анализом
  • Атрибутзначения нормализуются, как если бы проверяющий процессор
  • заменял символьные и проанализированные ссылки на сущности
  • секции CDATA заменялись их символьным содержимым
  • декларация XML и декларация типа документа(DTD) удаляются
  • Пустые элементы преобразуются в пары начальных и конечных тегов
  • Пробелы за пределами элемента документа и внутри начальных и конечных тегов нормализуются
  • Все пробелы всодержание символов сохраняется (исключая символы, удаленные при нормализации перевода строки)
  • Разделители значений атрибутов устанавливаются в кавычки (двойные кавычки)
  • Специальные символы в значениях атрибутов и содержимом символов заменяются ссылками на символы
  • Лишние объявления пространства имен удаляются изкаждый элемент
  • Атрибуты по умолчанию добавляются к каждому элементу
  • Лексикографический порядок накладывается на объявления пространства имен и атрибуты каждого элемента

Реализация этого метода может быть найдена в apache xml security project в классе Canonicalizer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...