Цифровая подпись частей XML-документа

У меня есть XML-документ, имеющий структуру, подобную следующей

<envelop>
    <header>blaa</header>
    <message>blaa blaa</message>
    <footer></footer>
</envelop>

Я хочу поставить цифровую подпись для элементов заголовка и сообщения и добавить подпись к элементу нижнего колонтитула.

Как я могу подписать элементы, а затем проверить подпись (используя .net c #)?


person Eros    schedule 23.06.2009    source источник


Ответы (6)


Вы должны иметь возможность добавить XPath-Transform к подписи. Это должно выглядеть примерно так:

       <Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
         <XPath xmlns:dsig="&dsig;">
         ...
         </XPath>
       </Transform>

Я плохо владею XPath, но должно быть легко сформулировать XPath-выражение, исключающее элемент Footer. (Но обратите внимание, что XPath является необязательной частью XML-DSIG, поэтому не все реализации могут его поддерживать).

В качестве альтернативы, если вы можете реструктурировать свой документ, чтобы он был

<envelop>
  <header>blaa</header>
  <message>blaa blaa</message>
  <Signature></Signature>
</envelop>

or

<envelop>
  <signedEnvelope>
    <header>blaa</header>
    <message>blaa blaa</message>
  </signedEnvelope>
  <Signature></Signature>
</envelop>

вы можете справиться с этим, используя преобразование Enveloped Signature Transform (первый случай) или подписав элемент signedEnvelope (второй случай).

person Rasmus Faber    schedule 23.06.2009
comment
Привет, Расмус, у меня нет возможности реструктурировать xml, поскольку формат определяется сторонним приложением. Я рассмотрю преобразование XPath. Спасибо - person Eros; 23.06.2009

Прочтите это http://msdn.microsoft.com/en-us/library/ms229745.aspx

person joe    schedule 23.06.2009
comment
ссылка объясняет, как вы можете подписать весь документ (установив для свойства Uri значение). Как я могу расширить это, чтобы частично подписать элементы xml, а затем проверить подпись? - person Eros; 23.06.2009

Есть партнер Microsoft, который может быть очень хорош для этого. Они позволяют добавлять цифровые подписи для XML (как и для всех других платформ). Рекомендую проверить их товар, он называется cosign.

person KirstenPowell    schedule 26.01.2011


Почему бы не следовать рекомендациям w3 для подписи XML http://www.w3.org/2000/09/xmldsig# он имеет базовую структуру:

<Signature>
   <SignedInfo>
      <SignatureMethod />
      <CanonicalizationMethod />
      <Reference>
         <Transforms>
         <DigestMethod>
         <DigestValue>
      </Reference>
      <Reference /> etc.
   </SignedInfo>
   <SignatureValue />
   <KeyInfo />
   <Object />
</Signature>

Если вам нужны более продвинутые функции, прочтите о XAdES - я думаю, что он доступен в C #.

person Vexatus    schedule 24.06.2009

Я вижу, что это старый пост, но, возможно, сейчас у кого-то такая же потребность. Вам нужно что-то вроде подписи в оболочке XMLDSIG. Разница в том, что в XMLDSIG необходимо включить данные подписи в узел Подпись.

Если вы хотите это сделать, вы должны реализовать это самостоятельно.

Я участвую в проекте по разработке библиотеки, обеспечивающей поддержку XAdES для .NET Framework.

Мы только что выпустили версию 1.0, которая обеспечивает раннюю поддержку XAdES-BES.

Вы можете найти его в проекте XAdES .NET

Я надеюсь, что исходный код может вам чем-то помочь.

С Уважением.

person Luis M. Villa    schedule 10.12.2010