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

У меня есть документ XML, структура которого похожа на следующую

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

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

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

6 ответов

Решение

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

       <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>

или же

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

Вы могли бы справиться с этим с помощью преобразования Enveloped Signature Transform (первый случай) или путем подписания элемента SignEnvelope (второй случай).

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

Почему бы не следовать рекомендациям 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#.

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

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

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

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

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

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

С уважением.

Другие вопросы по тегам