Tag: xml signature

如何仅签署XML的特定部分

我试图通过只签署部分xml来做一些XML签名但是经过多次搜索后我找不到解决方案。 我使用java来使用Xpath2转换和EXCLUSIVE规范化来签署XML。 如果我有以下XML wsfrwerwerwer addr ND somevalue 354 并签名,我得到以下输出(真实数据替换为虚拟) wsfrwerwerwer addr ND somevalue 354 //*[local-name()=’addr’]/* sdlfjdeklsdfngf femhjgklnlkl swerwerwrwerwerwe 如果我validation签名,一切都很好但是这里的问题就是在此之后我在XML中执行一个XSLT,它对某些元素执行了一些更改,但没有保留原封不动的签名元素( ns0:addr )。 即使我明确地说只应该对“addr”元素进行签名,如果我尝试对其任何父级( payload , msg或addr )执行更改,那么当(根据我的理解)它不应该签名时它会失败。 如果我对其他元素(如标题内的任何内容)执行更改,则签名仍然有效。 我已经测试了XPath表达式( //*[local-name()=’addr’]/* )并且它选择了要签名的正确数据( ns2:data ),但它似乎也采用了导致它的所有元素从根元素开始( msg , addr )。 我也尝试使用不同的转换,例如UNION,但这根本不起作用。 有谁知道问题可能是什么? 在Java中,是否有任何方法可以在签署XML以进行调试时准确查看正在签名的内容? 编辑: 稍后运行的xslt将执行诸如将命名空间从ns0:addr元素移动到根元素(msg)的操作,并且还将主要元素名称和命名空间从msg更改为newmsg(以及不同的默认命名空间),但是签名数据( ns2:data )完好无损。 用于签名的代码或多或少是这里提到的代码http://docs.oracle.com/javase/7/docs/technotes/guides/security/xmldsig/XMLDigitalSignature.html 除了ENVELOPED转换,我使用的是XPATH2转换: Map namespaceMap = new HashMap(0); namespaceMap.put(“ns0”, “http://someaddres/ad/m3”); XPathType xPathType = […]

xmlsignatureforms的XSLT转换,是xmldocument的一部分?

我有一个HTML页面(表单),用户将在其中输入他的详细信息。 要输入的详细信息 名称 年龄 薪水 州 市 现在当用户输入所有细节并单击按钮时,我将创建包含用户详细信息的xml文件 abc 40 20000 xyz abc 在此之后,我想使用XMLSignature签署此xml文件。 我想只使用XSLT转换和一些摘要和签名方法签署文档的两个元素,即name和salary元素。 我的问题是如何在xmlsignature的transform元素中使用XSLT变换。 实现这一目标的最佳方法是什么? 当用户在HTML页面中按下另一个按钮时 ,还会出现另一个问题,即应显示已签名的元素,即应向用户显示名称和工资。 我怎样才能做到这一点。 XSLT转换也会在这里发挥作用吗? 注意 : 我正在使用Java库来实现XMLSignature

手动validationXML签名

我可以成功地进行手动引用validation(规范化每个引用的元素 – > SHA1 – > Base64 – >检查它是否与DigestValue内容相同)但是我对SignatureValue的validation失败了。 这是规范化和散列的SignedInfo: d2cIarD4atw3HFADamfO9YTKkKs= YR/fZlwJdw+KbyP24UYiyDv8/Dc= Ater删除标签之间的所有空格(以便将整个元素放在一行上),我获得了这个sha1摘要(在Base64中): 6l26iBH7il / yrCQW6eEfv / VqAVo = 现在我希望在解密SignatureValue内容后找到相同的摘要,但我得到一个不同且更长的值: MCEwCQYFKw4DAhoFAAQU3M24VwKG02yUu6jlEH + u6R4N8Ig = 这是decyption的一些java代码: DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilder(); Document doc = builder.parse(new File(inputFilePath)); NodeList nl = doc.getElementsByTagName(“ds:SignatureValue”); if (nl.getLength() == 0) { throw new Exception(“Cannot find SignatureValue element”); } String […]

Java相当于C#XML签名方法

我编写了以下.NET Framework 3.5 C#方法,该方法获取XML文档的位置和X509数字证书的对象表示(使用私钥),并将XML文档作为对象返回,并嵌入XML签名(XMLDsig)作为根的第一个子元素。 问题是我需要能够使用Java SE 6执行完全相同的过程,但我还没有编写任何Java,并且不知道从哪里开始。 任何人都可以在Java代码中提供产生完全相同 XML输出的等效方法吗? private static XmlDocument SignXmlDocument(string xmlFilePath, X509Certificate2 certificate) { // load xml from disk preserving whitespaces XmlDocument xmlDocument = new XmlDocument { PreserveWhitespace = true }; xmlDocument.Load(xmlFilePath); // create signed xml with a same-document reference containing an enveloped-signature transform SignedXml signedXml = new SignedXml(xmlDocument) { SigningKey = […]

xmlSignature java中的XSLT转换?

我有一个XML文档。我正在使用xmlsignature签署文档的一部分。 在找到摘要之前, 我想应用XSLT转换。 根据我读到的内容,XSLT将XML文档转换为另一种格式(也可以是XML)。 现在我很困惑, 改造后的新文件在哪里可用? 如果我想将其显示给用户,如何从这个新创建的文档中检索值? 我的XML文档 asd ghi 转型代码 Transform t=fac.newTransform(Transform.XPATH,new XPathFilterParameterSpec(“/r1/user”)); 根据xpath转换,每当用户元素的值发生更改时,不应validationxmlsignature。 如果person元素的值发生变化,那么应该validationSignature。 但是当我更改person元素的值时,签名不会被validation。 为什么?

Java XML DSig和XPath

我正在使用Java XML DSig api签署XML文档的一部分。 我试图了解它是如何达到摘要值的。 我的文件是: bar 我的xpath表达式是: PurchaseOrder/foo/text() 我试图做的是: 调用Java DSIG库并查看生成的摘要的值。 使用MessageDigest(SHA-1)类来消化值“bar”。 validation1和2的摘要是否匹配。 当我这样做时,1和2产生不同的摘要值。 要么我的DSIG代码完全出错了,要么我不明白DSIG是如何工作的。 有任何想法吗? 这是我的测试代码(对不起,这么久……我应该回到perl): public class GenerateXmlSignature2 { private static final String xml = “bar”; private static final String xpath = “PurchaseOrder/foo/text()”; public static void main(String[] args) throws Exception { Base64 base64 = new Base64(); // Create a DOM XMLSignatureFactory that […]

Xpath转换在java中不起作用

这是我的xml文档。 我想使用xml签名仅签署userID部分。 我正在使用xpath转换来选择该特定元素。 xyz text http://localhost:8080/saml/SProvider.jsp 我使用以下代码添加转换: transformList.add(exc14nTransform); transformList.add(fac.newTransform(Transform.XPATH, new XPathFilterParameterSpec(“samlp:AuthnRequest/UserID xmlns:samlp=\”urn:oasis:names:tc:SAML:2.0:protocol\””))); 但我得到以下内容: Original Exception was javax.xml.transform.TransformerException: Extra illegal t okens: ‘xmlns’, ‘:’, ‘samlp’, ‘=’, ‘”urn:oasis:names:tc:SAML:2.0:protocol”‘ 所以,我尝试删除xmlns部分。 transformList.add(fac.newTransform(Transform.XPATH, new XPathFilterParameterSpec(“samlp:AuthnRequest/UserID”))); 但它签署了整个文件并给出了以下信息: com.sun.org.apache.xml.internal.security.utils.CachedXPa thFuncHereAPI fixupFunctionTable INFO: Registering Here function 问题是什么? 编辑 正如@JörnHorstmann所说,这个消息只是一个日志或类似的东西。 现在的问题是,即使在给出xpath查询之后,整个文档也会被签名而不仅仅是UserID。 我通过在签署文档后更改元素的值来确认这一点。 结果是文档没有得到validation(如果它只签署了UserID部分,那么对所做的任何更改都应该产生有效的签名。)