Проверка цифровой подписи XML
-
05-07-2019 - |
Вопрос
Я пытался проверить подпись 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.
Здесь более полное объяснение. Если вам интересно, ознакомьтесь с спецификацией .