Вопрос

Я пытался проверить подпись XML.

Проверка в соответствии с этим учебником хорошо.

Но я также попробовал второй подход. Чтобы проверить это с помощью метод проверки класса Signature Я извлек подпись и сертификат из 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;
}

результат был ложным. Подпись не проверяла. В чем может быть причина этого?

Это было полезно?

Решение

Вы не можете проверить XMLDsig, как это. Это не сработает. Подпись не рассчитывается по необработанному XML. Он должен пройти канонизацию, дайджест и т. Д.

Что вы используете для data [] ? Чтобы сделать это правильно, вам почти нужно переписать библиотеку XMLDsig.

Другие советы

Если data [] является содержимым подписанного XML-файла, что такое sigToVerify?

XMLSig создает элемент Signature-Element (SignedInfo), который содержит дайджест каждого подписываемого элемента и мета-информацию, например используемые алгоритмы канонизации / преобразования. Затем дайджест этого SignedInfo-Elemnt рассчитывается и подписывается.

Следовательно, если sigToVerify является подписью, созданной реализацией XMLSignature, она не должна совпадать с подписью всего файла XML.

Здесь более полное объяснение. Если вам интересно, ознакомьтесь с спецификацией .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top