Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
XML的Canonical XML和Exclusive Canonical XML有什么区别?_创想鸟

XML的Canonical XML和Exclusive Canonical XML有什么区别?

c14n和exc-c14n的核心区别在于命名空间处理:c14n包含所有作用域内的命名空间声明,而exc-c14n只包含当前元素或其子元素直接使用或声明的命名空间;2. 在处理空白字符、属性顺序、字符编码、实体引用、cdata节、注释和处理指令等方面,c14n和exc-c14n的处理规则完全一致;3. exc-c14n专为xml数字签名设计,确保被签名子树的规范化形式独立于外部上下文,具备可移植性和自包含性;4. 当对整个文档签名时c14n可行,但对局部元素签名时应使用exc-c14n以保证签名在不同上下文中仍有效;5. 因此,在xml数字签名中更倾向于使用exc-c14n,因其增强了签名的鲁棒性、减少对外部结构的依赖,并提升安全性和灵活性。

XML的Canonical XML和Exclusive Canonical XML有什么区别?

XML的Canonical XML(C14N)和Exclusive Canonical XML(Exc-C14N)之间的核心区别,在于它们在处理XML文档中的命名空间声明时,对于“作用域内”和“实际使用”的判断逻辑。简单来说,C14N会包含所有在作用域内的命名空间,而Exc-C14N则更“排他”,只包含那些被当前元素或其子元素直接使用或声明的命名空间,尤其是在处理XML文档的局部(子树)时,这一点变得至关重要。

我花了不少时间与XML签名打交道,深知Canonical XML(C14N)和Exclusive Canonical XML(Exc-C14N)之间的细微差别绝非小事,它直接影响着签名数据的有效性和安全性。

你可以把 Canonical XML (C14N) 理解为一种“全面公开”的版本。它的主要目标是消除XML文档中所有不影响逻辑意义的差异,确保两个逻辑上相同的文档能产生完全一致的字节流。这包括标准化属性顺序、空白字符、字符编码,以及非常重要的一点:命名空间声明。当C14N处理一个元素时,它会追溯整个祖先链,并包含所有“在作用域内”的命名空间声明,即使当前元素或其直接子元素并未明确使用它们。这保证了当你对整个文档进行规范化时,能得到一个始终如一的输出。然而,问题在于当你只想对文档的某个“部分”进行签名时。如果你提取一个子树,然后用C14N对其进行规范化,那些从其原始上下文继承的、未使用的命名空间仍然会被包含进来。这可能会导致问题,因为如果这个子树被移动到另一个XML文档中,而那些继承的命名空间在那里可能不在作用域内或可能发生冲突,那么规范化形式(以及签名)就会改变。

这正是 Exclusive Canonical XML (Exc-C14N) 介入的地方。它是一种更具针对性的方法,专为XML数字签名等场景设计,因为在这些场景中,你通常需要对特定的元素或子树进行签名。它的“排他性”意味着它会“排除”那些并非由当前元素或其子元素在被规范化的子树中直接使用或声明的继承命名空间。相反,它只包含那些在元素本身上“明确声明”的命名空间,或者那些在子树内部被元素或其属性/子元素“实际引用”的命名空间。这使得子树的规范化形式更加便携和自包含。你可以将这个已签名的子树复制、粘贴到另一个XML文档中,只要其内部结构和“自身”的命名空间声明保持一致,它的规范化形式(以及签名)就将保持有效,而无需考虑周围文档的命名空间上下文。

本质上,C14N追求的是文档级别的整体一致性,而Exc-C14N则追求子树级别的自给自足和可移植性。如果你要对整个文档进行签名,C14N通常是可行的。但如果你要签名的是像<signedinfo></signedinfo>元素或XML文档中的特定数据块,那么Exc-C14N几乎总是更正确、更安全的选择,以确保签名在被签名部分移动或重新上下文化时仍然有效。

为什么在XML数字签名中更倾向于使用Exclusive Canonical XML?

这确实是一个很常见的问题,它直接触及了实际应用的核心。在XML数字签名中,更倾向于使用Exc-C14N并非随意之举;它源于对健壮和可移植签名的基本设计要求。

当你对一个XML文档,或者更常见地,对其某个特定部分进行签名时,签名实际上是对该数据“规范化形式”的哈希值。如果规范化过程在不同上下文下对相同逻辑数据产生不同的结果,那么你的签名就会变得脆弱。

想象一下你有这样一个XML文档:

<root xmlns="http://example.com/ns1" xmlns:a="http://example.com/nsA">  <data a:attr="value">    <item xmlns:b="http://example.com/nsB">Some text</item>  </data></root>

现在,假设你只想签名其中的<data></data>元素。

如果你使用 Canonical XML (C14N)<data></data>进行规范化,它的规范化形式会包含xmlns="http://example.com/ns1"xmlns:a="http://example.com/nsA",因为它们在作用域内,从<root></root>继承而来,即使<data></data>本身只直接使用了a:attr。如果你随后将这个已签名的<data></data>元素嵌入到另一个XML文档中,例如,其中默认命名空间是http://example.com/ns2,或者xmlns:a未定义,那么对原始已签名<data></data>的C14N处理仍然会产生相同的结果(因为它基于其原始上下文)。但如果这个<data></data>元素被单独提取并签名,它的C14N形式仍然会携带那些继承的命名空间,使其自包含性较差。

而使用 Exclusive Canonical XML (Exc-C14N) 时,当你签名<data></data>元素,它将包含在<data></data>上明确声明的命名空间,或者由<data></data>或其子元素使用的命名空间。在我们的例子中,它会包含xmlns:a="http://example.com/nsA"(因为a:attr被使用),但会包含xmlns="http://example.com/ns1"<root></root>的默认命名空间),除非<data></data>本身明确使用了默认命名空间。这使得已签名的<data></data>子树更具独立性。你可以复制它,粘贴到另一个XML文档中,只要内容及其“明确声明/使用”的命名空间保持不变,其Exc-C14N形式将是相同的,签名也将保持有效。

这种自包含的特性对于以下几个原因至关重要:

可移植性: 已签名的片段可以在文档之间移动而不会使签名失效。这对于分布式系统至关重要,因为XML片段可能在不同系统间传递。减少依赖: 签名的有效性较少依赖于周围的文档结构,更多地依赖于签名数据本身的完整性。清晰性和简洁性: 子树的规范化形式不会被潜在不相关的继承命名空间声明所混淆。

因此,本质上,Exc-C14N之所以受到青睐,是因为它生成的规范化形式对于周围XML上下文的变化具有鲁棒性,使得XML数字签名在对文档任意部分进行签名时更加可靠和灵活。它将签名内容隔离,使其成为一个真正原子化、可验证的单元。

Canonical XML和Exclusive Canonical XML在处理空白字符和属性顺序上有区别吗?

这是一个很好的澄清点,因为人们常常会混淆规范化的所有方面。答案非常直接:不,它们在处理空白字符和属性顺序方面没有区别。

Canonical XML (C14N) 和 Exclusive Canonical XML (Exc-C14N) 都建立在一套共同的规则之上,用于规范化XML文档的“物理”表示。它们的核心目的是消除那些不影响XML逻辑意义但可能改变其字节流的变体。

以下是两种规范化算法都一致执行的操作:

空白字符规范化:它们将所有换行符转换为#xA(LF)。它们删除元素内容中可忽略的空白字符(例如,元素之间的缩进)。文本节点内或xml:space="preserve"元素内的空白字符会被保留。属性顺序:元素内的属性按照命名空间URI然后是本地名称进行词法排序。这确保了a="1" b="2"b="2" a="1"产生相同的规范化形式。命名空间声明(核心区别之外):它们确保命名空间声明被正确放置和添加前缀。它们在其各自的作用域内删除冗余的命名空间声明(例如,如果xmlns:foo="bar"在一个元素上声明,然后在子元素上以相同的URI重新声明,根据特定的规范化规则,子元素的声明可能会被删除,如果它是冗余的)。字符编码:输出始终是UTF-8。实体引用:所有实体引用(例如,&<、自定义实体)都替换为其字符等效项。CDATA节:CDATA节被替换为其字符内容。注释和处理指令:默认情况下,注释和处理指令会从规范化形式中移除。存在一些特定变体(例如,“带注释”

以上就是XML的Canonical XML和Exclusive Canonical XML有什么区别?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1430035.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
XQuery和XPath在查询XML数据时有什么区别?
上一篇 2025年12月17日 03:16:19
XML文档声明(prolog)中encoding属性的作用是什么?
下一篇 2025年12月17日 03:16:24

相关推荐

  • VSCode精简配置Git:中文提交记录、分支可视化、冲突解决

    首先解决中文乱码需配置Git和VSCode编码为UTF-8,其次通过GitLens或Git Graph实现分支可视化,最后利用VSCode内置的冲突解决工具高效处理合并冲突,全面提升Git使用体验。 在VSCode里用Git,我总觉得能再顺手点。特别是处理中文提交信息、想直观看看分支图,或者面对恼人…

    2026年9月22日
    500
  • MySQL数据类型详解_如何选择合适字段类型提升存储效率

    MySQL数据类型详解_如何选择合适字段类型提升存储效率MySQL数据类型详解_如何选择合适字段类型提升存储效率MySQL数据类型详解_如何选择合适字段类型提升存储效率MySQL数据类型详解_如何选择合适字段类型提升存储效率

    mysql选择合适数据类型的核心原则是根据数据特性选择占用空间最小且能准确表达数据的类型。1. 选择整数类型时,应依据数据范围选择tinyint、smallint、mediumint、int或bigint,优先选更小类型以节省空间;2. 字符串类型中,char适用于固定长度数据,varchar适用于…

    2026年9月22日 用户投稿
    000
  • VSCode调试FPGA工程的技巧(结合Vivado,快速定位问题)

    vscode在fpga开发中并非替代vivado,而是作为高效辅助工具提升开发效率。1. 在代码编写方面,vscode提供 superior 的语法高亮、自动补全和代码管理功能,显著优化verilog、systemverilog和tcl脚本的编写体验,并通过git实现无缝版本控制;2. 在仿真与自动…

    2026年9月22日
    1200
  • Apache Pulsar 主题分区创建与管理指南

    本文深入探讨Apache Pulsar主题分区的创建与管理。Pulsar主题分区是实现高吞吐量和可伸缩性的关键,但必须在主题创建时进行配置。文章详细介绍了两种主要的分区主题创建方法:通过Broker配置实现自动分区,以及利用Pulsar Admin API进行显式创建,并强调了分区主题一旦创建后不可…

    2026年9月22日
    100
  • 如何查看Linux文件系统类型 df -T与lsblk -f命令对比

    如何查看Linux文件系统类型 df -T与lsblk -f命令对比如何查看Linux文件系统类型 df -T与lsblk -f命令对比如何查看Linux文件系统类型 df -T与lsblk -f命令对比如何查看Linux文件系统类型 df -T与lsblk -f命令对比

    在linux中查看文件系统类型时,df -t 适合查看已挂载分区的文件系统,而 lsblk -f 可查看所有块设备信息。1. df -t 显示已挂载的文件系统类型、磁盘使用情况及挂载点,适用于快速了解当前挂载目录所用文件系统;2. lsblk -f 列出包括未挂载设备的详细信息,如 uuid、lab…

    2026年9月22日 用户投稿
    300
  • PowerBI的AI混合工具怎么用?快速创建数据报表的详细操作方法

    PowerBI的AI混合工具通过Q&A、关键影响因素、异常检测和智能叙事等功能,降低数据分析门槛,加速从数据到决策的全过程。它让非技术人员用自然语言提问获取图表,自动识别数据异常与驱动因素,并生成文字解读,大幅提升分析效率。但需以高质量数据和合理建模为基础,结合业务逻辑验证结果,避免“垃圾进…

    2026年9月22日
    600
  • Sublime用于MySQL分库分表设计逻辑_适合大型系统水平扩展需求

    Sublime用于MySQL分库分表设计逻辑_适合大型系统水平扩展需求Sublime用于MySQL分库分表设计逻辑_适合大型系统水平扩展需求Sublime用于MySQL分库分表设计逻辑_适合大型系统水平扩展需求Sublime用于MySQL分库分表设计逻辑_适合大型系统水平扩展需求

    分库分表通过拆分数据提升数据库性能与扩展性,常见策略包括垂直分表、水平分表和分库;sublime 可辅助设计逻辑。1. 垂直分表按字段拆分,降低单表复杂度;2. 水平分表按行拆分,提升查询效率;3. 分库减少单节点压力,增强系统吞吐能力。使用 sublime 可高效编写 sql 脚本、注释分片规则、…

    2026年9月22日 用户投稿
    500
  • 使用Sublime管理MySQL数据库结构_高效编辑表结构与字段定义脚本

    使用Sublime管理MySQL数据库结构_高效编辑表结构与字段定义脚本使用Sublime管理MySQL数据库结构_高效编辑表结构与字段定义脚本使用Sublime管理MySQL数据库结构_高效编辑表结构与字段定义脚本使用Sublime管理MySQL数据库结构_高效编辑表结构与字段定义脚本

    用 sublime text 管理 mysql 数据库结构脚本高效且灵活。1. 适合习惯文本编辑、需自定义流程的开发者;2. 启动快、资源占用低,支持多光标、正则替换,插件丰富,易配合 git;3. 建议每张表单独文件、按模块分目录、主脚本汇总建表语句,索引外键单独文件;4. 推荐插件有 sqlto…

    2026年9月22日 用户投稿
    000
  • MySQL在Sublime中高亮配置指南_实现关键词提示与语法检查功能

    MySQL在Sublime中高亮配置指南_实现关键词提示与语法检查功能MySQL在Sublime中高亮配置指南_实现关键词提示与语法检查功能MySQL在Sublime中高亮配置指南_实现关键词提示与语法检查功能MySQL在Sublime中高亮配置指南_实现关键词提示与语法检查功能

    要配置sublime text以更好地处理mysql代码,需安装package control、sql语法包(如sqltools或sublimesql)、sublimelinter及sqlfluff进行语法检查,并可选装格式化与数据库连接插件。1. 安装package control是前提;2. 通…

    2026年9月22日 用户投稿
    500
  • Prestashop分页隐藏分类描述的SEO考量与处理

    本文探讨了Prestashop商店中分类描述在分页后消失的问题。我们解释了这种现象通常并非SEO问题,因为搜索引擎主要关注第一页的描述内容。教程将深入分析此行为背后的SEO逻辑,并提供确保网站SEO友好的最佳实践,强调第一页描述的重要性及规范使用Canonical标签。 Prestashop分类描述…

    2026年9月22日
    100
  • VSCode设置SSH远程开发(安全连接,跨平台开发指南)

    vscode的ssh远程开发功能通过ssh协议实现本地编辑器与远程服务器的安全连接,让用户能在本地直接操作远程代码,享受与本地一致的开发体验。首先需安装“remote – ssh”扩展并配置~/.ssh/config文件,定义host、hostname、user、port和identit…

    2026年9月22日
    000
  • MySQL执行时间分析与诊断_MySQL性能瓶颈精准定位

    MySQL执行时间分析与诊断_MySQL性能瓶颈精准定位MySQL执行时间分析与诊断_MySQL性能瓶颈精准定位MySQL执行时间分析与诊断_MySQL性能瓶颈精准定位MySQL执行时间分析与诊断_MySQL性能瓶颈精准定位

    mysql性能瓶颈定位与分析需从慢查询日志、执行计划、实时监控等多维度入手。1. 开启慢查询日志,设置slow_query_log=1、指定日志路径及阈值long_query_time,通过mysqldumpslow分析日志找出最慢sql;2. 使用explain命令查看sql执行计划,重点关注ty…

    2026年9月22日 用户投稿
    300
  • 一加Nord手机为什么无法卸载应用?解锁系统限制的详细方法

    无法卸载应用因权限或预装限制,需停用设备管理权限、通过应用管理卸载、使用ADB命令移除,或解锁Bootloader刷机彻底删除。 如果您尝试在使用一加Nord手机时卸载某个应用,但发现无法完成操作,这通常是因为该应用属于系统预装应用或具有设备管理权限,导致常规卸载方式失效。以下是解决此问题的步骤: …

    2026年9月22日
    100
  • Invideo的AI混合工具怎么用?快速生成专业视频的实用教程

    Invideo的AI混合工具通过智能生成视频初稿并允许创作者精细调整,显著降低制作门槛、提升效率,其优势在于快速生成、易用性强、激发创意,用户可通过优化输入、替换素材、注入个性声音和保持风格统一来最大化潜力,同时需应对素材模式化、理解偏差等挑战。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索,…

    2026年9月22日
    500
  • MySQL中如何使用存储过程提高业务逻辑复用_示例讲解?

    MySQL中如何使用存储过程提高业务逻辑复用_示例讲解?MySQL中如何使用存储过程提高业务逻辑复用_示例讲解?MySQL中如何使用存储过程提高业务逻辑复用_示例讲解?MySQL中如何使用存储过程提高业务逻辑复用_示例讲解?

    存储过程在 mysql 中用于封装业务逻辑,提升复用性并减少网络传输。它是一组预定义的 sql 语句集合,通过参数调用实现功能,如查询订单及计算消费总额。其优点包括提高执行效率、统一数据操作逻辑、增强安全性和便于维护。例如,输入客户 id 即可返回订单信息与总消费金额。优化方式有:1. 使用 out…

    2026年9月22日 用户投稿
    200
  • 抖音流量助推怎么来的?平台流量助推什么意思

    近年来,短视频平台迅速崛起,其中以抖音最为突出。作为一个专注于短视频内容分享的平台,抖音凭借其智能算法和多元化的内容生态,吸引了海量用户。而“抖音流量助推”这一概念,也成为众多创作者和品牌实现快速成长的重要工具。本文将带您深入了解抖音流量助推背后的运作机制。 一、抖音流量助推的核心机制 1. 推荐算…

    2026年9月22日
    300
  • 如何使用DeepSpeed训练AI大模型?大规模模型训练的优化技巧

    DeepSpeed通过ZeRO等技术突破显存限制,实现大模型高效训练。它采用ZeRO-1/2/3分级优化,分别对优化器状态、梯度和参数进行分区,显著降低单卡显存占用;结合混合精度、梯度累积和CPU/NVMe卸载进一步节省资源。同时集成流水线并行与张量并行,支持多维并行策略协同,使万亿参数模型训练在普…

    2026年9月22日
    200
  • NvidiaCanvas的AI混合工具如何使用?创作智能画作的详细教程

    NVIDIA Canvas是一款基于AI的智能图像生成器,它将用户涂鸦的材质色块实时转化为逼真风景,核心在于语义理解与风格化合成。其工作流程包括选择材质笔刷、在输入画布绘制概念图、利用图层与风格预设快速迭代,并导出成果。相比传统绘画工具,Canvas优势在于高效生成、降低创作门槛、支持快速探索与创意…

    2026年9月22日
    300
  • diskgenius如何设置Bios启动项

    diskgenius是一款功能全面的磁盘管理软件,在实际操作中,为了顺利运行该工具或进行系统维护,常常需要在bios中调整启动顺序。以下是详细的设置步骤说明。 当计算机开机或重启时,请留意屏幕初始画面中的提示信息,按下指定键进入bios设置界面。不同品牌和型号的主板所使用的快捷键有所区别,常见的包括…

    2026年9月22日
    200
  • MySQL查询缓存配置及性能_MySQL重复查询响应速度提升

    MySQL查询缓存配置及性能_MySQL重复查询响应速度提升MySQL查询缓存配置及性能_MySQL重复查询响应速度提升MySQL查询缓存配置及性能_MySQL重复查询响应速度提升MySQL查询缓存配置及性能_MySQL重复查询响应速度提升

    mysql查询缓存已不适用于现代应用场景,尤其在8.0版本中被彻底移除。它仅适合读多写少、数据几乎不变的静态查询,通过内存直接返回结果提升性能;但在数据频繁更新时,因基于表级的缓存失效机制,每次写操作都会清空相关缓存,导致频繁重建缓存并消耗大量cpu资源,形成性能瓶颈。此外,sql语句匹配严格、内存…

    2026年9月22日 用户投稿
    500

发表回复

登录后才能评论
关注微信