Domanda

Stavo cercando di convalidare una firma XML.

La validazione secondo questo tutorial funziona multa.

Ma ho anche provato ad un secondo approccio. Per verificarlo con verifica metodo della classe Signature Ho estratto la firma e il certificato dal file xml e ho fatto quanto segue:

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

il risultato è stato falso. La firma non è stata verificata. Quale potrebbe essere la ragione di ciò?

È stato utile?

Soluzione

Non puoi verificare XMLDsig in questo modo. Non funzionerebbe. La firma non viene calcolata su XML non elaborato. Deve passare attraverso la canonicalizzazione, il digest, ecc.

Cosa usi per data [] ? Per farlo bene, devi quasi riscrivere la libreria XMLDsig.

Altri suggerimenti

Se i dati [] sono il contenuto del file XML firmato, che cos'è sigToVerify?

XMLSig crea un elemento Signature (SignedInfo) che contiene il digest di ciascun elemento da firmare e meta-informazioni come gli algoritmi di canonicalizzazione / trasformazione utilizzati. Quindi il digest di questo SignedInfo-Elemnt viene calcolato e firmato.

Quindi, se sigToVerify è la firma creata da un'implementazione di XMLSignature, non deve essere uguale alla firma del file XML completo.

Qui è un spiegazione più completa. E se sei interessato, dai un'occhiata alla specifica .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top