XML数字签名验证

时间:2009-09-09 14:22:44

标签: java xml digital-signature verify xml-signature

我试图验证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;
}

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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

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

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