0

我试图验证 XML 签名。

根据本教程的验证工作正常。

但我也尝试了第二种方法。为了使用 Signature 类的verify 方法进行验证,我从 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;
}

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

4

2 回答 2

2

您不能像这样验证 XMLDsig。它行不通。签名不是基于原始 XML 计算的。它必须经过规范化,摘要等。

你有什么用data[]?为了让它正确,您几乎必须重写 XMLDsig 库。

于 2009-09-09T14:44:36.313 回答
0

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

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

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

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

于 2009-09-09T16:54:30.060 回答