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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline mikla  
#1 Оставлено : 6 июня 2016 г. 13:48:47(UTC)
mikla

Статус: Активный участник

Группы: Участники
Зарегистрирован: 27.08.2015(UTC)
Сообщений: 33
Беларусь

Сказал(а) «Спасибо»: 23 раз
Добрый день.

Пытаюсь подписать часть XML документа:

Код:
val documentToSign: Elem =
      <PatientRecord>
        <Name>John Doe</Name>
        <Account id="acct">123456</Account>
        <Visit date="10pm March 10, 2002">
          <Diagnosis>Broken second metacarpal</Diagnosis>
        </Visit>
        <Sig></Sig>
      </PatientRecord>

val jdkDocumentToSign = xpath.evaluate("//Visit",  documentToSign, XPathConstants.NODE).asInstanceOf[Node]


т.е. я хочу подписать, только Visit тег + то, что внтури него.

Код:
 // Провайдер XMLDSigRI.
    val pxml = new XMLDSigRI
    val sigFactory: XMLSignatureFactory = XMLSignatureFactory.getInstance("DOM", pxml)

    // signing whole document
    val referenceURI = ""
    val transforms: List[Transform] = List(
      sigFactory.newTransform(Transform.ENVELOPED, null.asInstanceOf[TransformParameterSpec]),
      sigFactory.newTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS, null.asInstanceOf[XMLStructure])
    )

    // Ссылка на подписываемые данные с указанием алгоритма хеширования.
    val signAlgName = Consts.URI_GOST_SIGN
    val digestAlgName = Consts.URI_GOST_DIGEST
    val ref = sigFactory.newReference(referenceURI, sigFactory.newDigestMethod(digestAlgName, null), transforms.asJava, null, null)

    // Создаем объект SignedInfo с указанием алгоритма подписи.
    val signedInfo = sigFactory.newSignedInfo(sigFactory.newCanonicalizationMethod(CanonicalizationMethod.EXCLUSIVE,
    null.asInstanceOf[C14NMethodParameterSpec]), sigFactory.newSignatureMethod(signAlgName, null), List(ref).asJava)

    val keyInfoFactory: KeyInfoFactory = sigFactory.getKeyInfoFactory
    var keyInfo: KeyInfo = null

    // Создаем X509Data, содержащий сертификат.
    val x509d: X509Data = keyInfoFactory.newX509Data(Collections.singletonList(cert))

    // Создаем KeyInfo и добавляем X509Data в него.
    keyInfo = keyInfoFactory.newKeyInfo(Collections.singletonList(x509d))

    val dsc: DOMSignContext = new DOMSignContext(privateKey, parentSigNodes)

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

    // Создаем XMLSignature.
    val signature = sigFactory.newXMLSignature(signedInfo, keyInfo)

    // Подписываем.
    signature.sign(dsc)

    val os: OutputStream = new FileOutputStream("Sign.xml")
    val trans: Transformer = TransformerFactory.newInstance.newTransformer
      trans.transform(new DOMSource(jdkWholeDocument), new StreamResult(os))   


Но, такое ощущение, что он подписывает все равно весь документ.

В логах видно такое сообщение:
Код:

2016-06-06 13:36:13 DEBUG r.C.J.d.i.DigesterOutputStream requestId=unknown userId=unknown origin=unknown companyId=unknown success=unknown - Pre-digested input:
2016-06-06 13:36:13 DEBUG r.C.J.d.i.DigesterOutputStream requestId=unknown userId=unknown origin=unknown companyId=unknown success=unknown - <PatientRecord>
        <Name>John Doe</Name>
        <Account id="acct">123456</Account>
        <Visit date="10pm March 10, 2002">
          <Diagnosis>Broken second metacarpal</Diagnosis>
        </Visit>
        <Sig></Sig>
      </PatientRecord>


Как правильно подписать только часть XML документа?

Спасибо.
Offline Евгений Афанасьев  
#2 Оставлено : 6 июня 2016 г. 14:35:50(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Здравствуйте.
Возможно, проблема в строке:
Автор: mikla Перейти к цитате
referenceURI = ""

Если не ошибаюсь, "" означает весь документ.

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
mikla оставлено 06.06.2016(UTC)
Offline mikla  
#3 Оставлено : 6 июня 2016 г. 16:00:41(UTC)
mikla

Статус: Активный участник

Группы: Участники
Зарегистрирован: 27.08.2015(UTC)
Сообщений: 33
Беларусь

Сказал(а) «Спасибо»: 23 раз
Автор: afev Перейти к цитате
Здравствуйте.
Возможно, проблема в строке:
Автор: mikla Перейти к цитате
referenceURI = ""

Если не ошибаюсь, "" означает весь документ.



Да, верное, если указать ID элемента #Visit, например, то подпишет только <Visit> таг.

Можно ли как-то указать какой набор данных подписывать с помощью XPath?
Offline Евгений Афанасьев  
#4 Оставлено : 6 июня 2016 г. 16:20:46(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Думаю, можно, с помощью Transform.XPATH, как-то так (пример SignFileExample в пакете JCPxml.dsig.internal.xmldsigri.tests в samples-sources.jar в архиве JCP или http://www.xinotes.net/notes/note/751/):
Код:

String PATH = "/PatientRecord/Account";
String referenceURI = "";

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();

XPathExpression expr = xpath.compile(xPath);
Document document = ...

NodeList nodes = (NodeList) expr.evaluate(document, XPathConstants.NODESET);
Node nodeToSign = nodes.item(0);
Node sigParent = nodeToSign.getParentNode();

transforms = new ArrayList<Transform>() {{
		    add(sigFactory.newTransform(
			    Transform.XPATH,
			    new XPathFilterParameterSpec(PATH)
			)
		    );
		    add(sigFactory.newTransform(
			    Transform.ENVELOPED,
			    (TransformParameterSpec) null
			)
		    );
		}};

Reference ref = sigFactory.newReference(
			    referenceURI,
			    sigFactory.newDigestMethod(..., null),
			    transforms,
			    null, 
			    null
			);

DOMSignContext dsc = new DOMSignContext(privateKey, sigParent);
XMLSignature signature = sigFactory.newXMLSignature(signedInfo, keyInfo);
signature.sign(dsc);
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
mikla оставлено 06.06.2016(UTC)
Offline mikla  
#5 Оставлено : 20 июня 2016 г. 12:46:07(UTC)
mikla

Статус: Активный участник

Группы: Участники
Зарегистрирован: 27.08.2015(UTC)
Сообщений: 33
Беларусь

Сказал(а) «Спасибо»: 23 раз
Спасибо.

а referenceURI = "" - это верно в данном случае?

Автор: afev Перейти к цитате
Думаю, можно, с помощью Transform.XPATH, как-то так (пример SignFileExample в пакете JCPxml.dsig.internal.xmldsigri.tests в samples-sources.jar в архиве JCP или http://www.xinotes.net/notes/note/751/):
Код:

String PATH = "/PatientRecord/Account";
String referenceURI = "";

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();

XPathExpression expr = xpath.compile(xPath);
Document document = ...

NodeList nodes = (NodeList) expr.evaluate(document, XPathConstants.NODESET);
Node nodeToSign = nodes.item(0);
Node sigParent = nodeToSign.getParentNode();

transforms = new ArrayList<Transform>() {{
		    add(sigFactory.newTransform(
			    Transform.XPATH,
			    new XPathFilterParameterSpec(PATH)
			)
		    );
		    add(sigFactory.newTransform(
			    Transform.ENVELOPED,
			    (TransformParameterSpec) null
			)
		    );
		}};

Reference ref = sigFactory.newReference(
			    referenceURI,
			    sigFactory.newDigestMethod(..., null),
			    transforms,
			    null, 
			    null
			);

DOMSignContext dsc = new DOMSignContext(privateKey, sigParent);
XMLSignature signature = sigFactory.newXMLSignature(signedInfo, keyInfo);
signature.sign(dsc);


Offline Евгений Афанасьев  
#6 Оставлено : 20 июня 2016 г. 13:47:16(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
По идее, так. Можно проверить, меняя данные вне узла (подпись должна провериться) и внутри узла (ошибка при проверке).
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
mikla оставлено 23.06.2016(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.