Преобразование XSLT в xmlsignature java?

у меня есть XML-документ.Я подписываю часть документа с помощью xmlsignature. Прежде чем найти дайджест, Я хочу применить преобразование XSLT.

согласно тому, что я читал, XSLT преобразует XML-документ в другой формат (также может быть XML). теперь я смущен, что,
где будет преобразованный новый документ доступен?

как получить значение из этого вновь созданного документа, если я хочу показать его пользователь?

мой XML-документ

<r1>
 <user>asd</user>
 <person>ghi</person>
</r1>

код для преобразования

Transform t=fac.newTransform(Transform.XPATH,new XPathFilterParameterSpec("/r1/user"));

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

3 ответов


преобразование xslt, используемое при подписании документа, относится к выбору узлов в исходном XML при вычислении подписи.

вопрос/ответ by Дэйв относится к подписыванию частей XML-документа с помощью xpath2. The ссылка на Шон Mullans' в должности в этом ответе предполагается, что xpath2 более подходит для подписания частей документа, поскольку оценка выражения xpath выполняется для каждого узла.

так на основе sun dsig пример можно заменить на ссылка создание с помощью:

List<XPathType> xpaths = new ArrayList<XPathType>();
xpaths.add(new XPathType("//r1/user", XPathType.Filter.INTERSECT));

Reference ref = fac.newReference
  ("", fac.newDigestMethod(DigestMethod.SHA1, null),
        Collections.singletonList
          (fac.newTransform(Transform.XPATH2, 
                  new XPathFilter2ParameterSpec(xpaths))),
             null, null); 

в данном //Р1/пользователей быть защищенным подписью, в то время как остальная часть документа может быть изменена.

проблема с выбором xpath / xpath2 заключается в том, что подпись может быть сгенерирована для / some / node/that/does/not / exist. Вы правы, чтобы изменить тестовый документ и убедиться, что подпись работает так вы ожидаете.

вы можете проверить документ в тестовой программе, создав подпись, а затем подделав узел xml перед проверкой:

NodeList nlt = doc.getElementsByTagName("user");
nlt.item(0).getFirstChild().setTextContent("Something else");


Более надежной альтернативой селектору xpath может быть размещение идентификатора на элементах xml-документа, которые вы надеетесь подписать как:
<r1>
 <user id="sign1">asd</user>
 <person>ghi</person>
</r1>

затем ссылайтесь на этот идентификатор как на URI в первом параметре обернутой передачи:

Reference ref = fac.newReference
  ("#sign1", fac.newDigestMethod(DigestMethod.SHA1, null),
    Collections.singletonList
      (fac.newTransform(Transform.ENVELOPED,(TransformParameterSpec) null)),
          null, null); 


На выходных операция подписи добавляет новый элемент подписи в DOM, загруженный в память. Вы можете транслировать вывод, преобразуя его следующим образом:
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.setOutputProperty(OutputKeys.INDENT, "yes");

trans.transform(new DOMSource(doc), new StreamResult(System.out)); 

спецификация XSLT не определяет, что происходит с результирующим документом; это определяется спецификациями API выбранного процессора XSLT. Например, если вы вызываете XSLT из Java с помощью интерфейса JAXP, вы можете запросить результат в виде дерева DOM в памяти или сериализовать его в указанный файл на диске.

вы пометили свой вопрос "Java", который является единственным ключом, который вы даете своей среде обработки. Я предполагаю, что вы хотите превратиться в DOM и затем используйте интерфейсы DOM, чтобы получить значение из нового документа. Хотя, если вы используете XSLT 2.0 и Saxon, интерфейс s9api намного более удобен, чем собственный интерфейс JAXP.


часть xslt определяет только определение преобразования, ничего больше. Взгляните на это:

Ява учебник по XSLT

во Франсуа гравий ответить на вход.XML-файл-это файл, который будет преобразован, преобразование.xslt-это определение xslt, которое описывает, как преобразовать xml-файл. выход.из результатов, это может быть xml, но это также может быть html, плоский файл...

Это то, с чего я начал, когда я использовал xslt:

http://www.w3schools.com/xsl/default.asp

взгляните на это:

http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog