电话
400 9058 355
C#中验证XML数字签名需用System.Security.Cryptography.Xml的XmlDocument和SignedXml类:先加载XML并定位节点,再用公钥(来自证书、.cer/.pfx文件或RSA公钥)调用CheckSignature()验证,注意Canonicalization方法、URI解析及编码一致性。
在C#中验证XML文件的数字签名,核心是使用 System.Security.Cryptography.Xml 命名空间中的 XmlDocument 和 SignedXml 类。关键在于:加载XML后,找到签名节点(),用公钥(通常来自证书或密钥容器)验证签名是否有效且内容未被篡改。
XML签名通常嵌入在文档内(Enveloped Signature),即 是文档的子元素。需先加载XML,再查找该节点:
XmlDocument.Load() 或 LoadXml() 加载原始XML字符串或文件GetElementsByTagName("Signature") 获取签名节点,确保至少有一个SignedXml 构造函数,例如:var signedXml = new SignedXml(doc); signedXml.LoadXml(signatureNode);
签名验证必须使用签名时对应的公钥。常见来源有三种:
,可用 signedXml.GetIdElement(doc, referenceUri) + signedXml.Signature.KeyInfo 提取证书,再取 Certificate.PublicKey.Key
X509Certificate2 加载,然后赋值给 signedXml.CheckSignature(certificate)
RSA.Create().ImportParameters(...))调用 signedXml.CheckSignature(rsaPublicKey)
调用验证方法后,必须检查返回值和异常,不能仅依赖无异常就认为有效:
signedXml.CheckSignature() 返回 bool:true 表示签名格式正确、哈希匹配、且密钥能成功解密签名值signedXml.CheckSignature(certificate) 还会验证证书链有效性(如未过期、可信根等),但默认不校验吊销状态signedXml.Signature.SignatureMethod 和 Reference.DigestMethod 是否符合安全策略(如禁用 SHA1)CheckSignature 会返回 false验证失败不等于签名无效,需排查以下典型问题:

http://www.w3.org/TR/2001/REC-xml-c14n-20010315)必须与验证时完全一致;SignedXml 默认使用 XmlDsigExcC14NTransformUrl,若签名用普通C14N,需手动设置 signedXml.SignedInfo.CanonicalizationMethod = XmlDsigC14NTransformUrl;
指向整个文档,确保 signedXml.LoadXml() 后文档未被修改;若 URI 指向特定ID(如 #id123),确认目标元素存在且有正确 Id 属性(注意:XML中ID属性名不一定是"id",需看 Reference.Uri 和实际属性名是否匹配)Encoding.UTF8(不含BOM)或显式指定编码,避免因字节差异导致哈希不匹配
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...