gpt4 book ai didi

Java XML DSig 和 XPath

转载 作者:搜寻专家 更新时间:2023-11-01 03:14:03 28 4
gpt4 key购买 nike

我正在使用 Java XML DSig api 对 XML 文档的一部分进行签名。我试图了解它是如何得出摘要值的。

我的文件是:

<?xml version=\"1.0\" encoding=\"UTF-8\"?><PurchaseOrder><foo>bar</foo></PurchaseOrder>

我的 xpath 表达式是:

PurchaseOrder/foo/text()

我尝试做的是:

  1. 调用 Java DSIG 库并查看生成的摘要值。
  2. 使用 MessageDigest (SHA-1) 类来摘要值“bar”。
  3. 验证 1 和 2 的摘要匹配。

当我这样做时,1 和 2 会产生不同的摘要值。要么我的 DSIG 代码做错了什么,要么我不明白 DSIG 是如何工作的。有什么想法吗?

这是我的测试代码(抱歉太长了……我应该回到 perl):

public class GenerateXmlSignature2 {
private static final String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><PurchaseOrder><foo>bar</foo></PurchaseOrder>";
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 will be used to
// generate the enveloped signature.
final XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");

// Create a Reference to the enveloped document (in this case,
// you are signing the whole document, so a URI of "" signifies
// that, and also specify the SHA1 digest algorithm and
// the ENVELOPED Transform.
final List<XPathType> xpaths = new ArrayList<XPathType>() {
{
add(new XPathType(xpath, XPathType.Filter.UNION));
}
};
List<Transform> transforms = new ArrayList<Transform>() {{
add(fac.newTransform(
Transform.XPATH2,
new XPathFilter2ParameterSpec(xpaths)
)
);
}};
Reference ref = fac.newReference
("", fac.newDigestMethod(DigestMethod.SHA1, null),
transforms,
null, null);


// Create the SignedInfo.
SignedInfo si = fac.newSignedInfo
(fac.newCanonicalizationMethod
(CanonicalizationMethod.INCLUSIVE,
(C14NMethodParameterSpec) null),
fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null),
Collections.singletonList(ref));


// Load the KeyStore and get the signing key and certificate.
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream("mykeystore.jks"), "changeit".toCharArray());
KeyStore.PrivateKeyEntry keyEntry =
(KeyStore.PrivateKeyEntry) ks.getEntry
("mykey", new KeyStore.PasswordProtection("changeit".toCharArray()));
X509Certificate cert = (X509Certificate) keyEntry.getCertificate();

// Create the KeyInfo containing the X509Data.
KeyInfoFactory kif = fac.getKeyInfoFactory();
List x509Content = new ArrayList();
x509Content.add(cert.getSubjectX500Principal().getName());
x509Content.add(cert);
X509Data xd = kif.newX509Data(x509Content);
KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));

// Instantiate the document to be signed.
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
Document doc = dbf.newDocumentBuilder().parse
(new ByteArrayInputStream(xml.getBytes()));

// Create a DOMSignContext and specify the RSA PrivateKey and
// location of the resulting XMLSignature's parent element.
DOMSignContext dsc = new DOMSignContext
(keyEntry.getPrivateKey(), doc.getDocumentElement());

// Create the XMLSignature, but don't sign it yet.
XMLSignature signature = fac.newXMLSignature(si, ki);



// Marshal, generate, and sign the enveloped signature.
signature.sign(dsc);

// Output the resulting document.
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(System.out));



System.out.println("\n\n*** SHA-1 Digest ***");
XPathExpression xpathExpression = XPathFactory.newInstance().newXPath().compile(xpath);
String data = xpathExpression.evaluate(new InputSource(new StringReader(xml)));
System.out.println("Xpath: " + data);
MessageDigest md;
md = MessageDigest.getInstance("SHA");
byte[] sha1hash;
md.update(data.getBytes(), 0, data.length());
sha1hash = md.digest();
String base64Sha1OfCanonicalXml = new String(base64.encode(sha1hash));
System.out.println("Digest: " + base64Sha1OfCanonicalXml);
}
}

最佳答案

以下示例位于:http://markmail.org/message/tdgioazns7l4yg6d#query:java%20xpath%20xml%20dsig%20bug+page:1+mid:tgw5kr7uscwkcran+state:results ,我发现我需要将 XPathType.Filter.UNION 更改为 XPathType.FILTER.INTERSECT。这似乎已经解决了我的问题。 XML DSig 库现在使用的是我预期的正确值。

关于Java XML DSig 和 XPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3744525/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com