@created4dev

Почему проверка ЭЦП в первом варианте выдает true а во втором false?

//Вариант 1
String xml=readFileAsString("test.xml");
Document doc = parseDocument(xml);
Element nscontext = XMLUtils.createDSctx(doc, "ds", "http://www.w3.org/2000/09/xmldsig#");
NodeList list = XPathAPI.selectNodeList(doc, "//ds:Signature", nscontext);
Element sigElement = (Element) list.item(list.getLength() - 1);
XMLSignature signature = new XMLSignature(sigElement, "");
org.apache.xml.security.keys.KeyInfo ki = signature.getKeyInfo();
X509Certificate certKey = null;
certKey = ki.getX509Certificate();
System.out.println(signature.checkSignatureValue(certKey));


//Вариант 2
//Строки берутся из этого же файла "test.xml"
String cert="...";  //Строчка берется из <ds:X509Certificate>
String data="...";  //Строчка берется из <ds:DigestValue>
String sign="...";  //Строчка берется из <ds:SignatureValue>
Certificate certificate = CertificateFactory.getInstance("X509").generateCertificate(new ByteArrayInputStream(Base64.decode(cert)));
PublicKey publicKey=certificate.getPublicKey();
Signature signature2 = Signature.getInstance(publicKey.getAlgorithm());		
signature2.initVerify(publicKey);
signature2.update(Base64.decode(data));
System.out.println(signature2.verify(Base64.decode(sign)));


В чем подвох? В чем принципиальное различие XMLSignature и Signature? Один и тот же файл, а результаты разные(в первом выдает - true, во втором - false).
  • Вопрос задан
  • 532 просмотра
Пригласить эксперта
Ответы на вопрос 1
@bobzer
Java EE Developer
Ну, во-первых, смысл эксперимента непонятен - у вас есть рабочий код проверки ЭЦП, зачем второй вариант?

Во-вторых - к сути вопроса. Можно предположить, что XMLSignature сделан не просто так, и отличается чем-то от Signature. А отличается тем, что XMLSignature учитывает тот факт, что у XML-документов есть структура, в то время как Signature осуществляет проверку неструктурированного массива байт. При использовании XMLSignature применяется канонизация, которая приводит считанную из файла DOM-структуру к некоему общему виду. При этом XMLSignature осуществляет проверку именно канонизированной DOM-структуры, а не массива байт, считанного из файла без какой-либо его интерпретации.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы