XML 规范化算法在直接调用时与作为 xml 数字签名的一部分调用时给出两个不同的结果?

2023-11-20

当我直接规范化某些 xml 时,与在对其执行数字签名时(在对 xml 进行散列之前也执行相同的规范化算法)相比,我得到了同一个 xml 文档的两个不同的哈希值?我发现数字签名规范化在规范化时包括新行字符“\n”和空格字符,而直接算法则不包括。

包括换行符+空格不在规范化规范中?我专门看这个版本http://www.w3.org/TR/2001/REC-xml-c14n-20010315

有谁知道发生了什么事吗?我已经包含了 xml 文档和代码的两个实现,以便您可以看到。

这真的让我很困惑,我想知道为什么,我是否遗漏了一些明显的东西?

<root>
  <child1>some text</child1>
  <child2 attr="1" />
</root>

直接规范化代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Security.Cryptography.Xml;
using System.Security.Cryptography;
using System.IO;
using System.ComponentModel;

namespace XML_SignatureGenerator
{
    class XML_C14N
    {
        private String _filename;
        private Boolean isCommented = false;
        private XmlDocument xmlDoc = null;

        public XML_C14N(String filename)
        {
            _filename = filename;
            xmlDoc = new XmlDocument();
            xmlDoc.Load(_filename);
        }

        //implement this spec http://www.w3.org/TR/2001/REC-xml-c14n-20010315
        public String XML_Canonalize(System.Windows.Forms.RichTextBox tb)
        {
            //create c14n instance and load in xml file
            XmlDsigC14NTransform c14n = new XmlDsigC14NTransform(isCommented);

            c14n.LoadInput(xmlDoc);

            //get canonalised stream
            Stream s1 = (Stream)c14n.GetOutput(typeof(Stream));
            SHA1 sha1 = new SHA1CryptoServiceProvider();
            Byte[] output = sha1.ComputeHash(s1);

            tb.Text = Convert.ToBase64String(output);

            //create new xmldocument and save
            String newFilename = _filename.Substring(0, _filename.Length - 4) + "C14N.xml";
            XmlDocument xmldoc2 = new XmlDocument();
            xmldoc2.Load(s1);
            xmldoc2.Save(newFilename);

            return newFilename;
        }

        public void set_isCommented(Boolean value)
        {
            isCommented = value;
        }

        public Boolean get_isCommented()
        {
            return isCommented;
        }
    }
}

xml数字签名代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;

namespace XML_SignatureGenerator
{
class xmlSignature
    {
        public xmlSignature(String filename)
        {
            _filename = filename;
        }

        public Boolean SignXML()
        {
            RSACryptoServiceProvider rsa =  new RSACryptoServiceProvider();
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.PreserveWhitespace = true;
            String fname = _filename; //"C:\\SigTest.xml";
            xmlDoc.Load(fname);

            SignedXml xmlSig = new SignedXml(xmlDoc);
            xmlSig.SigningKey = rsa;

            Reference reference = new Reference();
            reference.Uri = "";

            XmlDsigC14NTransform env = new XmlDsigC14NTransform(false);
            reference.AddTransform(env);

            xmlSig.AddReference(reference);
            xmlSig.ComputeSignature();

            XmlElement xmlDigitalSignature = xmlSig.GetXml();
            xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true));

            xmlDoc.Save(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "/SignedXML.xml");

            return true;
        }
        private String _filename;
    }
}

任何想法都会很棒!顺便说一下,这都是 C# 代码。

提前致谢

Jon


在我看来,XML Sig 处理空格的方式已经被破坏了。这当然不符合大多数有正确思维的人所说的规范化。改变空白应该not影响摘要,但在 xmlsig 中,它确实如此。

一种可能的解决方法是在将文档传递给签名生成代码之前将其传递给规范化器例程。这应该会让事情变得更加可预测。

本文可能有助于澄清事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XML 规范化算法在直接调用时与作为 xml 数字签名的一部分调用时给出两个不同的结果? 的相关文章

随机推荐

  • 跨域发布到 ASP.Net MVC 应用程序

    我正在开发一个应用程序 其中 HTML 和 javascript 块被传递到不同的客户端 我可以通过将以下内容添加到 Web 配置文件来获取 html javascript 块
  • JavaFX 使对象可见但不消耗(忽略)点击

    标题说明了一切 我在 JavaFX 中有一个矩形 用于透明 不透明效果 但我希望人们能够 点击 它 因此 当我说单击时 我的意思是当您单击它时 Java 应该假装它不存在 而是 单击 该对象下方的任何内容 当您使用 setVisible f
  • 与免费的 Java 分析器相比,商业 Java 分析器有哪些优势? Netbeans 中的那个?

    有时 我必须对 Java 代码进行一些分析工作 我想知道为什么我应该让我的老板使用商业分析器进行调查 而不是只使用 Netbeans 或 JConsole 中的分析器 值得投资的杀手级功能是什么 根据我使用 JProfiler 的经验 它是
  • 未捕获的类型错误:对象 [object Object] 没有方法“apply”

    我在我正在创建的新网站上收到此未捕获的类型错误 但我无法找出导致该错误的原因 我在下面的链接中重新创建了该问题 如果您查看浏览器的 JS 控制台 您会看到发生错误 但没有其他情况发生 http jsfiddle net EbR6D 2 Co
  • 有状态 lambda 表达式和无状态 lambda 表达式有什么区别?

    根据 OCP 一书 必须避免有状态操作 也称为有状态 lambda 表达式 书中提供的定义是 有状态 lambda 表达式是一种其结果取决于管道执行期间可能更改的任何状态的表达式 他们提供了一个示例 其中使用并行流将固定的数字集合添加到同步
  • Android 视频不适合视频视图纵向的宽度并且横向不占据全屏

    Android 视频在纵向时不适合视频视图的宽度 如何使视频的宽度在纵向时适合视频视图的宽度 当我将屏幕方向更改为横向时 我希望视频填充像 YouTube 应用程序一样全屏 当处于纵向时 视频将从屏幕的顶部到中间开始 而当处于横向时 视频将
  • 如何在OnRender中重绘或刷新?

    我想动态地画一些东西 以下代码显示了我的 OnRender 我正在程序中需要的地方设置 DrawItem 但当我打电话时DrawItem 5 我必须调用什么才能调用 OnRender protected override void OnRe
  • ipywidgets:根据另一个小部件的结果更新一个小部件

    我在 IPython 中使用小部件 它允许用户重复搜索短语并在另一个小部件 选择小部件 中查看结果 不同的标题 然后选择其中一个结果 简而言之 search text widgets Text description Search sear
  • FOSUserBundle:删除 emailCanonical 的唯一索引

    我正在尝试删除 emailCanonical 上的唯一索引 以便多个用户可以共享相同的电子邮件地址 但是 我不想直接编辑 FOS UserBundle Resources config doctrine User orm xml 因为对包本
  • 在路径或正文中发布参数

    我正在创建 Rest API 但我对 URL 结构感到困惑 我只需在 Post 请求中向服务器发送一个参数 我应该通过路径变量还是在请求正文中发送它 最佳做法是什么 当前 URL 示例 api v1 users id name name n
  • Android BroadcastReceiver,设备重启后自动运行服务

    您好 我正在编写一个应用程序 当手机重新启动时 该服务将自动启动 而不是单击该应用程序 这是我的代码 BootCompleteReceiver java package com example newbootservice import a
  • Swift - 带图像的自定义 MKPointAnnotation

    我正在尝试创建一个自定义MKPointAnnotation在地图视图上使用 它看起来非常像苹果照片中使用的那个 我将从服务器检索一些照片及其位置 然后我想显示一个像上面这样的注释 并在注释中包含图像 我目前有一个程序可以添加正常的MKPoi
  • 在 .NET 中序列化数据传输对象

    我有一组数据传输对象 例如很多请求 响应消息类 如 MainRequest MainResponse ShutDown Request ShutDown Response 随着项目的发展 新的课程不断出现 这些类必须从和到进行 反 序列化具
  • Swift 2 中的本地化

    我想本地化我的应用程序 我正在使用 Swift 2 我遵循本教程但我遇到了两个问题 1 两种语言的本地化图像均消失 我以相同的方式本地化了多个图像German and English 对于两种语言 一组图像 图像的 en 和 de 版本 都
  • 什么时候2个虚拟地址可以映射到同一个物理地址?

    这里有一个操作系统 计算机体系结构问题 我正在阅读有关缓存的内容 了解如何虚拟索引缓存是减少地址转换时间的选项 我遇到了以下情况 Virtual cache difficulties include Aliasing Two differe
  • 从 .ui 文件生成 .h 和 .cpp

    假设我有文件about ui 我怎样才能使 关于 h 和 关于 cpp 从我的 ui文件 我必须创建一个 moc文件也 我怎么能够compile创建后看看是否一切都正确发生 如果自动生成不起作用 就像我的情况 您可以使用 uic 手动生成头
  • 如何命名 R 图中由垂直线分隔的 x 轴部分(包 ggplot2)?

    我创建了一个堆积面积图ggplot2并添加了垂直线在某些位置上x axis 我现在想命名sections由这些垂直线分隔开 它的一个示例可能看起来像示例图中所示 也欢迎其他解决方案 我有一个向量breaks x axis 以及间隔名称的向量
  • 为什么ndb中required和default是互斥的?

    在旧的 google appengine 数据存储区 API 中 必需 和 默认 可以一起用于属性定义 使用ndb我得到一个 ValueError repeated required and default are mutally excl
  • 扩展 JFrame 与在程序内创建它

    在使用 Swing 制作应用程序时 我见过人们执行以下两件事之一来创建 JFrame 哪种方法更好 为什么 我是 Java 和编程的初学者 我唯一的学习来源是书籍 YouTube 和 Stack Overflow import import
  • XML 规范化算法在直接调用时与作为 xml 数字签名的一部分调用时给出两个不同的结果?

    当我直接规范化某些 xml 时 与在对其执行数字签名时 在对 xml 进行散列之前也执行相同的规范化算法 相比 我得到了同一个 xml 文档的两个不同的哈希值 我发现数字签名规范化在规范化时包括新行字符 n 和空格字符 而直接算法则不包括