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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Randoom  
#1 Оставлено : 1 июля 2009 г. 16:23:25(UTC)
Randoom

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

Группы: Участники
Зарегистрирован: 15.06.2009(UTC)
Сообщений: 89
Откуда: Уфа, РРЦ "АйТи"

При формировании ЭЦП на XML документ можно использовать различные Transform'ы
пример :

< ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="CN=User2,O=IT,C=RU">
< ds:SignedInfo>
< ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
< ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"/>
< ds:Reference URI="">
< ds:Transforms>
< ds:Transform Algorithm="http://www.w3.org/2006/12/xml-c14n11#WithComments"/>
< ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
< ds:Transform Algorithm="http://www.w3.org/2002/06/xmldsig-filter2">
< dsig-xpath:XPath xmlns:dsig-xpath="http://www.w3.org/2002/06/xmldsig-filter2" Filter="subtract">/*[local-name()='report_financing_activities']/*[local-name()='Signature' and namespace-uri()='http://www.w3.org/2000/09/xmldsig#']</dsig-xpath:XPath>
< /ds:Transform>

.....

некоторые из которых позволяют подписывать не весь XML. В частности /*[local-name()='report_financing_activities']/*[local-name()='Signature' and namespace-uri()='http://www.w3.org/2000/09/xmldsig#'] вырезает все предшетствующие подписи и подписывает именно сам документ, но ведь можно же сделать и такой фильтр "/*" и тогда подписываться будет пустота, т.к. этот фильтр удалит все элементы на момент подписания.
Т.е. будет подписанный документ с верной подписью, но данные в нем можно будет менять без проблем с проверкой подписи... а это не есть хорошо...

Вот и возникает вопрос - как узнать по пришедшему XML с ЭЦП по какой именно его части сделана подпись?

p.s. Главное это не затачиваться на определенные трансформы, т.к. их достаточно много. Т.е. как стандартным образом попросить у, допустим, signedXML ту самую XML по которой она и проверяет подпись, т.е. пропустить XML через трансформы стандартным способом?

p.p.s. вопрос в контексте .Net 3.5 и, возможно, шарпея


есть вариант решения в виде

foreach (Reference reference in signedXml.Signature.SignedInfo.References)
{
XmlDocument _document = (XmlDocument) xmlDocument.Clone();
for (int i = 0; i < reference.TransformChain.Count;i++ )
{
reference.TransformChain[i].LoadInput(_document);
foreach (var type in reference.TransformChain[i].OutputTypes)
{
if (type.Equals(typeof(XmlDocument)))
{
_document = ((XmlDocument)reference.TransformChain[i].GetOutput(typeof(XmlDocument)));
break;
}else if (type.Equals(typeof(Stream)))
{
_document.Load((Stream)reference.TransformChain[i].GetOutput(typeof(Stream)));
break;
}else if (type.Equals(typeof(XmlNodeList)))
{
...

Но:
1) очень громоздкий и ненадежный
2) Непонятно что делать с XmlNodeList, который иногда бывает единственный из вариантов работы Трансформа ;(
3) и как то нет уверенности что все это работает в принципе )))

Отредактировано пользователем 1 июля 2009 г. 17:04:00(UTC)  | Причина: Не указана

Offline Randoom  
#2 Оставлено : 3 июля 2009 г. 11:59:25(UTC)
Randoom

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

Группы: Участники
Зарегистрирован: 15.06.2009(UTC)
Сообщений: 89
Откуда: Уфа, РРЦ &quot;АйТи&quot;

Неужели никто не сталкивался с проблемой оценки степени подписанности XML документа ?
Offline Челпанов А.  
#3 Оставлено : 6 июля 2009 г. 16:25:15(UTC)
Челпанов А.

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

Группы: Участники
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах
То есть необходимо получить последовательность подписываемых (хешируемых) байтов
1. Скорее всего путь приводимый Вами неиболее правильный, несмотря на то, что он громоздкий.
2. Прогонять через преобразование канонизации C14N. ( RFC 3275 4.3.3.2 The Reference Processing Model )
3. Оно так и работает, можно посмотрить код Reference.CalculateHashValue. Ведь Вы хотите получить именно, то что хешируется?
С уважением, Александр.
Offline Randoom  
#4 Оставлено : 6 июля 2009 г. 16:39:51(UTC)
Randoom

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

Группы: Участники
Зарегистрирован: 15.06.2009(UTC)
Сообщений: 89
Откуда: Уфа, РРЦ &quot;АйТи&quot;

Челпанов А. написал:
То есть необходимо получить последовательность подписываемых (хешируемых) байтов
1. Скорее всего путь приводимый Вами неиболее правильный, несмотря на то, что он громоздкий.
2. Прогонять через преобразование канонизации C14N. ( RFC 3275 4.3.3.2 The Reference Processing Model )
3. Оно так и работает, можно посмотрить код Reference.CalculateHashValue. Ведь Вы хотите получить именно, то что хешируется?

Конечная цель - очень простая - выяснить какие элементы защищены подписью, а какие нет.
Offline Челпанов А.  
#5 Оставлено : 6 июля 2009 г. 17:12:29(UTC)
Челпанов А.

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

Группы: Участники
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах
Такая постановка некорректная.
В результате transform исходные узлы документа могут быть изменены до неузнаваемости.
Например, можно написать transofrom (XSLT), который применяется ко всему документу и все текстовые узлы "1руб" меняет на "1коп" и подписывает результат именно этого transform. В этом случае корневой узел подписан или нет?

Можно переформулировать вопрос так. Какие данные (OctetStream) подписываются? Это наиболее близко к Вашему подходу.
С уважением, Александр.
Offline Randoom  
#6 Оставлено : 6 июля 2009 г. 17:21:20(UTC)
Randoom

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

Группы: Участники
Зарегистрирован: 15.06.2009(UTC)
Сообщений: 89
Откуда: Уфа, РРЦ &quot;АйТи&quot;

Челпанов А. написал:
Такая постановка некорректная.
В результате transform исходные узлы документа могут быть изменены до неузнаваемости.
Например, можно написать transofrom (XSLT), который применяется ко всему документу и все текстовые узлы "1руб" меняет на "1коп" и подписывает результат именно этого transform. В этом случае корневой узел подписан или нет?

Можно переформулировать вопрос так. Какие данные (OctetStream) подписываются? Это наиболее близко к Вашему подходу.


Вообщем то Вы правы, именно тот факт что различные XPath/XSL преобразования могут сделать с документом перед подписанием все что угодно и пугает.
Подниму конечную цель на еще один уровень абстракции :
1) Нужно сделать интерфейс проверки валидности XML документов с одной и более подписями, гарантирующий что ЭЦП охватила все данные в этих документах(в нашем случае - в неизменном виде) и нельзя их незаметно частично модифицировать при передаче.
2) Реализовать один из вариантов подписания XML несколькими ЭЦП под данную схему проверки (.net)

Вы простите что я пишу одно и тоже по второму кругу... просто чувствую что что-то не совсем так как я себе это представляю, осталось понять что ...

з.ы. Можно чуть подробнее про
Челпанов А. написал:

2. Прогонять через преобразование канонизации C14N. ( RFC 3275 4.3.3.2 The Reference Processing Model )

В контексте .Net ?

Отредактировано пользователем 6 июля 2009 г. 17:38:12(UTC)  | Причина: Не указана

Offline Челпанов А.  
#7 Оставлено : 6 июля 2009 г. 17:37:41(UTC)
Челпанов А.

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

Группы: Участники
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах
Самый простой (и я думаю самый эффективный способ) при подписи реализовать один из возможных вариантов подписи всего документа в целом.
При проверке подписи, кроме проверки собственно подписи, проверять, что в подписи заданы те и только те трансформы с теми же параметрами в том же порядке, которые Вы зафиксировали (задокументировали) как стандарт для Вашего подписанного документа.
Зачем лишняя универсальность?
P.S. Про преобразование XML NodeList в Octet stream из .Net точно не скажу, могу только сказать, что аналогично XmlDsigExcC14NWithCommentsTransform и запись в stream. С ходу не напишу :(

Отредактировано пользователем 6 июля 2009 г. 17:59:58(UTC)  | Причина: Не указана

С уважением, Александр.
Offline Randoom  
#8 Оставлено : 6 июля 2009 г. 17:41:43(UTC)
Randoom

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

Группы: Участники
Зарегистрирован: 15.06.2009(UTC)
Сообщений: 89
Откуда: Уфа, РРЦ &quot;АйТи&quot;

Челпанов А. написал:
Самый простой (и я думаю самый эффективный способ) при подписи реализовать один из возможных вариантов подписи всего документа в целом.
При проверке подписи, кроме проверки собственно подписи, проверять, что в подписи заданы те и только те трансформы с теми же параметрами в том же порядке, которые Вы зафиксировали (задокументировали) как стандарт для Вашего подписанного документа.
Зачем лишняя универсальность?

Убедительно, осталось только найти корректный способ подписания XML документа несколькими ЭЦП. Если случаем есть доки, статьи или код на Net по этой теме - буду искренне рад помощи.
Offline Челпанов А.  
#9 Оставлено : 6 июля 2009 г. 21:54:33(UTC)
Челпанов А.

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

Группы: Участники
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах
Интересен я так понял вариант простановки нескольких независимых подписей на содержимое документа с внедрением их внутрь документа.
Для этого необходимо использовать соответствующий transform, который будет удалять все (в том числе и созданные позднее) подписи из документа. Этого можно достичь при помощи XSLT или XPath. Например, так
Код:
&lt;XPath xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"&gt;not(ancestor-or-self::dsig:Signature)&lt;/XPath&gt;

Прикрепил, небольшой примерчик по простановке двух подписей.

Отредактировано пользователем 6 июля 2009 г. 21:55:58(UTC)  | Причина: Не указана

Вложение(я):
gdsig2.cs (11kb) загружен 53 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
С уважением, Александр.
Offline Randoom  
#10 Оставлено : 7 июля 2009 г. 11:16:56(UTC)
Randoom

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

Группы: Участники
Зарегистрирован: 15.06.2009(UTC)
Сообщений: 89
Откуда: Уфа, РРЦ &quot;АйТи&quot;

Челпанов А. написал:
Интересен я так понял вариант простановки нескольких независимых подписей на содержимое документа с внедрением их внутрь документа.
Для этого необходимо использовать соответствующий transform, который будет удалять все (в том числе и созданные позднее) подписи из документа. Этого можно достичь при помощи XSLT или XPath. Например, так
Код:
&lt;XPath xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"&gt;not(ancestor-or-self::dsig:Signature)&lt;/XPath&gt;

Прикрепил, небольшой примерчик по простановке двух подписей.

Спасибо!
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.