Pregunta

Estaba intentando validar una firma XML.

La validación de acuerdo con este tutorial funciona bien.

Pero también traté de un segundo enfoque. Para verificarlo con el método de verificación de la clase Signature Extraje la firma y el certificado del archivo xml, e hice lo siguiente:

    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;
}

el resultado fue falso. La firma no se verificó. ¿Cuál podría ser la razón para eso?

¿Fue útil?

Solución

No se puede verificar XMLDsig de esta manera. No funcionaria La firma no se calcula sobre el XML sin procesar. Tiene que pasar por canonicalización, digestión, etc.

¿Qué usas para data [] ? Para hacerlo bien, casi tienes que volver a escribir la biblioteca XMLDsig.

Otros consejos

Si los datos [] son ??el contenido del archivo XML firmado, ¿qué es sigToVerify?

XMLSig crea un elemento de firma (SignedInfo) que contiene el resumen de cada elemento que se firmará y metainformación, como los algoritmos de canonicalización / transformación utilizados. Luego se calcula y firma el resumen de este SignedInfo-Elemnt.

Por lo tanto, si sigToVerify es la firma creada por una implementación de XMLSignature, no debe ser igual a la firma del archivo XML completo.

Aquí es una Una explicación más completa. Y si está interesado, eche un vistazo a la especificación .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top