2009-09-09 112 views
0

我试图验证XML签名。XML数字签名验证

根据此tutorial验证工作正常。

但我也试过第二种方法。与Signature类 的verify method验证我的手写签名,并从XML文件中的证书,我做了以下内容:

public static boolean checkSignedFile(byte[] data, byte[] sigToVerify, 
     byte[] cert, String algorithm) throws CertificateException, 
     NoSuchAlgorithmException, InvalidKeyException, SignatureException { 
    CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
    Certificate c = (Certificate) cf 
      .generateCertificate(new ByteArrayInputStream(cert)); 
    PublicKey pk = c.getPublicKey(); 
    Signature sig; 
    boolean verifies = false; 
    sig = Signature.getInstance(algorithm); 
    sig.initVerify(pk); 
    sig.update(data); 
    verifies = sig.verify(sigToVerify); 
    return verifies; 
} 

结果为假。签名没有验证。这可能是什么原因?

+0

教程链接似乎不再适用。 – Yster 2015-04-29 09:52:33

+0

这可能是新的:http://www.oracle.com/technetwork/articles/javase/dig-signature-api-140772.html – Yster 2015-04-29 10:37:44

回答

2

您无法像这样验证XMLDsig。它不会工作。签名不是通过原始XML计算的。它必须经过规范化,消化等。

你对data[]有什么用?为了做到这一点,你几乎必须重写XMLDsig库。

+0

data []实际上是经过签名的文件。我已经检查过它与xml签名中的摘要具有相同的摘要。所以文摘是一样的。这就是为什么我很好奇为什么验证不起作用 – iffi 2009-09-09 14:50:00

+0

所以该文件是XMLDsig签名的XML文件?那么你会在文件中签名,对吗?如果你可以验证整个文件,会不会是一个鸡蛋问题:) – 2009-09-09 15:20:49

+0

我知道现在有点晚了......但你如何使用摘要? – 2012-08-13 16:12:59

0

如果data []是签名的XML文件的内容,什么是sigToVerify?

XMLSig创建一个Signature-Element(SignedInfo),其中包含要签名的每个元素的摘要以及元信息,如使用的规范化/转换算法。然后这个SignedInfo-Elemnt的摘要被计算和签名。

因此,如果sigToVerify是由XMLSignature实现创建的签名,则它不能等于完整XML文件的签名。

Here是一个更完整的解释。如果你有兴趣,看看specification