【问题标题】:Digitally Sign Parts of a XML document对 XML 文档的各个部分进行数字签名
【发布时间】:2009-06-23 10:55:03
【问题描述】:

我有一个类似于以下结构的 XML 文档

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

我想对页眉和消息元素进行数字签名并将签名添加到页脚元素。

如何对元素进行签名,然后再验证签名(使用 .net c#)?

【问题讨论】:

    标签: xml cryptography digital-signature xml-signature signedxml


    【解决方案1】:

    您应该能够将 XPath-Transform 添加到签名中。它应该看起来像这样:

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

    我不精通 XPath,但应该很容易制定一个排除页脚元素的 XPath 表达式。 (但请注意,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>
    

    您可以通过使用信封签名转换(第一种情况)或通过签署 signedEnvelope 元素(第二种情况)来处理它。

    【讨论】:

    • 嗨 Rasmus,我没有重新构建 xml 的选项,因为格式是由第三方应用程序决定的。我将研究 XPath 转换。谢谢
    【解决方案2】:

    【讨论】:

    • 该链接说明了如何签署整个文档(将 Uri 属性设置为“”)。如何将其扩展为对 xml 元素进行部分签名,然后再验证签名?
    【解决方案3】:

    有一个 Microsoft 合作伙伴可以很好地解决这个问题。它们允许您为 XML(以及所有其他平台)添加 digital signatures。我建议检查他们的产品,它被称为 cosign。

    【讨论】:

      【解决方案4】:
      【解决方案5】:

      为什么不遵循 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# 中可用。

      【讨论】:

        【解决方案6】:

        我看到这篇文章很旧,但也许现在有人有同样的需求。您需要的有点像 XMLDSIG 中的封装签名。不同之处在于,在 XMLDSIG 中,您必须在 Signature 节点中包含签名数据。

        如果你想这样做,你必须自己实现它。

        我参与了一个开发库以提供对 .NET Framework 的 XAdES 支持的项目。

        我们刚刚发布了 1.0 版,它提供了对 XAdES-BES 的早期支持。

        你可以在XAdES .NET Project找到它

        希望源代码能对你有所帮助。

        问候。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-20
          • 1970-01-01
          • 1970-01-01
          • 2015-09-12
          • 1970-01-01
          • 2015-06-20
          • 2011-10-15
          相关资源
          最近更新 更多