문제

XML Document.i는 XMLSignature를 사용하여 문서의 일부에 서명하고 있습니다.다이제스트를 찾기 전에 XSLT 변환을 적용하고 싶습니다.



읽은 것에 따라 XSLT는 XML 문서를 다른 형식으로 변환합니다 (XML도 가능합니다). 이제는 혼란스러워합니다. 변형 된 새 문서는 Avilable입니다.
원하는 경우이 새로 생성 된 문서에서 가치를 검색하는 방법사용자에게 표시하려면?

내 XML 문서

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

변환을위한 코드

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

XPath 변환에 따르면 사용자 요소의 값이 변경 될 때마다 XMLSignature의 유효성을 검사해서는 안됩니다.그리고 사람 요소의 값이 변경되면 서명을 유효화해야합니다.그러나 사람 요소의 값을 변경하면 서명이 유효하지 않습니다.왜?

도움이 되었습니까?

해결책

문서에 서명 할 때 사용되는 XSLT 변환은 서명을 계산할 때 소스 XML의 노드가 선택되는 방식과 관련이 있습니다.

이 질문 / 답변 Dave 는 XPath2를 사용하여 XML 문서의 서명과 관련이 있습니다. the 링크 이 답변에서 Sean 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); 
.

이를 통해 // r1 / user 은 나머지 문서를 변경할 수있는 동안 서명으로 보호 할 수 있습니다.

XPath / XPath2 선택의 문제점은 / 일부 / 노드 / 해당 /하지 /하지 / / node 에 대해 서명을 생성 할 수 있다는 것입니다. 테스트 문서를 수정하고 서명이 예상되는 방식으로 작동하는지 확인할 수 있습니다.

인증 전에 서명을 생성 한 다음 XML 노드로 변조를 생성하여 테스트 프로그램에서 문서를 테스트 할 수 있습니다.

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


XPath 선택기에 대한보다 신뢰할 수있는 대안은 XML 문서 요소에 ID를 넣을 수 있습니다.

<r1>
 <user id="sign1">asd</user>
 <person>ghi</person>
</r1>
.

은이 ID를 Enveloped 전송의 첫 번째 매개 변수에서 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 사양은 결과 문서에 어떤 일이 발생하는지 정의하지 않습니다.선택한 XSLT 프로세서의 API 사양에 의해 정의됩니다.예를 들어 JAXP 인터페이스를 사용하여 Java에서 XSLT를 호출하는 경우 결과를 메모리의 DOM 트리 또는 디스크의 지정된 파일로 직렬화 할 수 있습니다.

처리 환경에 제공하는 유일한 단서 인 "Java"에 태그를 지정했습니다.내 추측은 DOM으로 변환하고 DOM 인터페이스를 사용하여 새 문서에서 값을 가져 오려고합니다.XSLT 2.0 및 색소폰을 사용하는 경우 S9API 인터페이스는 기본 JAXP 인터페이스보다 훨씬 사용할 수 있습니다.

XSLT 부분은 변환 정의 만 정의하지 않습니다. 이것 좀 봐 :

Java XSLT 자습서

Francois 자갈 응답 input.xml 파일은 변환 될 파일이며, transform.xslt는 XML 파일을 변환하는 방법을 설명하는 XSLT 정의입니다.출력. 아웃 결과, 이것은 XML 일 수 있지만 HTML, 플랫 파일 일 수도 있습니다 ...

XSLT를 사용 중일 때 시작하는 곳입니다.

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

이이 좀 봐도됩니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top