Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline MaximComse  
#1 Оставлено : 2 марта 2020 г. 12:05:07(UTC)
MaximComse

Статус: Новичок

Группы: Участники
Зарегистрирован: 02.03.2020(UTC)
Сообщений: 2

Добрый день, знатоки!
Помогите разобраться новичку :)
Не понятно что конкретно участвует в расчете хеш. Вот полный документ который отправляется на подпись:
Код:
<doc:document 
xmlns:cct="http://emias.mos.ru/simi/cct"      
xmlns:doc="http://emias.mos.ru/simi/document"      
xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
xmlns:simicore="http://emias.mos.ru/simi/core">
	<doc:metadata>
		<doc:documentId>ecd99ae4-b15c-46f0-a98c-c16aeb7619a2</doc:documentId>
		<doc:documentInfo>
			<simicore:patientId>79812</simicore:patientId>
		</doc:documentInfo>
	</doc:metadata>
	<doc:content mimeClass="APPLICATION" mimeType="application/tdd" valid="true"><doc:data>MDAx</doc:data></doc:content>
	<doc:signature signeeLogin="username" technicalSignature="true"/>
</doc:document>


По замыслу в расчете хеш должен участвовать только тег doc:content с содержимым

Код:

org.apache.xml.security.Init.init();
JCPXMLDSigInit.init();

Document doc = --указанный выше документ
/*при парсинге документа указано что
factory.setNamespaceAware(true);
*/

String providerName = "ru.CryptoPro.JCPxml.dsig.internal.dom.XMLDSigRI";

final XMLSignatureFactory sigFactory = XMLSignatureFactory.getInstance("DOM",(Provider) Class.forName(providerName).newInstance());

NodeList signNodes = CryptoUtils.xPathToNodeList(doc, "//*[local-name() = 'signature']");

Node sigParent = signNodes.item(0);
String referenceURI = ""; // Пустая строка означает весь документ.
List transforms = new ArrayList<Transform>() {{
            add(sigFactory.newTransform(Transform.XPATH, new XPathFilterParameterSpec(xpathString)));//xpathString = //doc:content
            add(sigFactory.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null));
}};
        
Reference ref = sigFactory.newReference(referenceURI,
                sigFactory.newDigestMethod(Consts.URN_GOST_DIGEST_2012_256, null), transforms, null, null);

SignedInfo signedInfo = sigFactory.newSignedInfo(
                sigFactory.newCanonicalizationMethod(CanonicalizationMethod.EXCLUSIVE, (C14NMethodParameterSpec) null),
                sigFactory.newSignatureMethod(Consts.URN_GOST_SIGN_2012_256, null), Collections.singletonList(ref));

KeyInfoFactory keyInfoFactory = sigFactory.getKeyInfoFactory();
        
X509Data x509d = keyInfoFactory.newX509Data(Collections.singletonList(cert));

KeyInfo keyInfo = keyInfoFactory.newKeyInfo(Collections.singletonList(x509d));

DOMSignContext dsc = new DOMSignContext(privateKey, sigParent);

dsc.setProperty("org.jcp.xml.dsig.internal.dom.SignatureProvider", JCP.PROVIDER_NAME);

XMLSignature signature = sigFactory.newXMLSignature(signedInfo, keyInfo);
        
signature.sign(dsc);

в итоге получается:
Код:
<?xml version="1.0" encoding="UTF-8"?>
<doc:document xmlns:doc="http://emias.mos.ru/simi/document" xmlns:cct="http://emias.mos.ru/simi/cct" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:simicore="http://emias.mos.ru/simi/core">
	<doc:metadata>
		<doc:documentId>ecd99ae4-b15c-46f0-a98c-c16aeb7619a2</doc:documentId>
		<doc:documentInfo>
			<simicore:patientId>79812</simicore:patientId>
		</doc:documentInfo>
	</doc:metadata>
	<doc:content mimeClass="APPLICATION" mimeType="application/tdd" valid="true">
		<doc:data>MDAx</doc:data>
	</doc:content>
	<doc:signature signeeLogin="username" technicalSignature="true">
		<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
			<SignedInfo>
				<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
				<SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/>
				<Reference URI="">
					<Transforms>
						<Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
							<XPath>//doc:content</XPath>
						</Transform>
						<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
					</Transforms>
					<DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/>
					<DigestValue>CnP0L9CaumMYIx0wElcSDdW4hvxmnldoZOzhnWKbG/U=</DigestValue>
				</Reference>
			</SignedInfo>
			<SignatureValue>iZiY/wLmBAnXRNLtouqudI+oyLrbuA3Bu+Z6dlqSBKPBsqnO/MnhDNwZCbcA7rzTfUfRf7w991hDlMPFLNTfcg==</SignatureValue>
			<KeyInfo>
				<X509Data>
					<X509Certificate>MIII...</X509Certificate>
				</X509Data>
			</KeyInfo>
		</Signature>
	</doc:signature>
</doc:document>


Если поменять что-то например в doc:metadata хеш будет другой. Что-то не так в xpath?

Отредактировано пользователем 2 марта 2020 г. 16:32:26(UTC)  | Причина: Не указана

Offline two_oceans  
#2 Оставлено : 3 марта 2020 г. 4:36:37(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 395 раз в 366 постах
Автор: MaximComse Перейти к цитате
По замыслу в расчете хеш должен участвовать только тег doc:content с содержимым
Если поменять что-то например в doc:metadata хеш будет другой. Что-то не так в xpath?
Добрый день. Похоже, что действительно Xpath не срабатывает, но я не очень силен в выражениях Xpath.

Поясню почему Xpath для меня на втором плане: трансформ XPath далеко не везде поддерживается, поэтому наиболее общий путь добиться просто выбора заданного фрагмента без дальнейнего фильтрования внутри фрагмента - добавить в тег doc:content атрибут с типом xs:ID - в самом простом случае это "атрибут по умолчанию" Id (если его разрешает схема связанная с префиксом doc). Если сам атрибут Id не разрешен схемой, но разрешены другие схемы, то wsu:Id наиболее частое решение. И только если Id и сторонние схемы запрещены, только тогда имеет смысл выбирать тег через XPath.

Итак, если Id добавить можно, тогда для тега с Id="contentdoc" нужно в референсе указать с решеткой URI="#contentdoc". Заметьте, это не исключает использования Xpath для дальнейшего выбора внутри фрагмента - например, выкидывания всех текстовых узлов.

К слову, я бы рекомендовал поставить enveloped-signature трансформ первым - так на XPath пойдет именно тот документ, что был до подписи, а не документ с подписью.

Отредактировано пользователем 3 марта 2020 г. 5:00:45(UTC)  | Причина: Не указана

Offline MaximComse  
#3 Оставлено : 3 марта 2020 г. 8:32:16(UTC)
MaximComse

Статус: Новичок

Группы: Участники
Зарегистрирован: 02.03.2020(UTC)
Сообщений: 2

Спасибо за ответ!
От перемены мест трансформаций хеш не меняется.
В моем случае необходимо использовать именно xpath, ничего добавить в исходный документ я не могу.
Заметил кстати интересный эффект: если xpath это какая то выборка с использованием осей (//self) например, то JCP ко всем узлам дописывает xmlns аттрибуты.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.