Цифровая подпись частей 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 (второй случай).
Прочитайте это http://msdn.microsoft.com/en-us/library/ms229745.aspx
Есть партнер 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
Я надеюсь, что исходный код может вам как-то помочь.
С уважением.