При формировании ЭЦП на 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)
| Причина: Не указана