要在 .NET 中使用 RSA 密钥签署 XML 文件,您需要使用 System.Security.Cryptography 命名空间中的类。以下是一个简单的示例,说明如何使用 RSA 密钥签署 XML 文件并验证签名。
using System;
using System.IO;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
using System.Xml;
public static void SignXmlFile(string xmlFileName, string rsaKeyFileName, string signedXmlFileName)
{
// 加载 RSA 私钥
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider();
rsaKey.FromXmlString(File.ReadAllText(rsaKeyFileName));
// 加载要签名的 XML 文件
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(xmlFileName);
// 创建一个 SignedXml 对象
SignedXml signedXml = new SignedXml(xmlDoc);
// 添加 RSA 密钥作为签名方法
KeyInfo keyInfo = new KeyInfo();
keyInfo.AddClause(new RSAKeyValue(rsaKey));
signedXml.KeyInfo = keyInfo;
// 创建一个 Reference 对象,用于指定要签名的 XML 元素
Reference reference = new Reference();
reference.Uri = ""; // 指定要签名的 XML 元素的 Uri
// 添加一个 Transform 对象,用于指定签名时使用的算法
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);
// 将 Reference 对象添加到 SignedXml 对象中
signedXml.AddReference(reference);
// 计算签名
signedXml.ComputeSignature();
// 将签名保存到 XML 文件中
XmlElement xmlDigitalSignature = signedXml.GetXml();
xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true));
xmlDoc.Save(signedXmlFileName);
rsaKey.Dispose();
}
public static bool VerifyXmlFile(string signedXmlFileName, string rsaKeyFileName)
{
// 加载 RSA 公钥
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider();
rsaKey.FromXmlString(File.ReadAllText(rsaKeyFileName));
// 加载已签名的 XML 文件
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(signedXmlFileName);
// 创建一个 SignedXml 对象,并传入要验证的 XML 文档
SignedXml signedXml = new SignedXml(xmlDoc);
// 查找 XML 文档中的签名节点
XmlNodeList nodeList = xmlDoc.GetElementsByTagName("Signature");
if (nodeList.Count == 0)
{
throw new Exception("签名节点未找到");
}
// 加载签名节点
XmlElement xmlSignature = (XmlElement)nodeList[0];
signedXml.LoadXml(xmlSignature);
// 验证签名
bool isValid = signedXml.CheckSignature(rsaKey);
rsaKey.Dispose();
return isValid;
}
请注意,这个示例仅用于演示如何使用 RSA 密钥签署和验证 XML 文件,实际应用中可能需要对代码进行优化和调整。
领取专属 10元无门槛券
手把手带您无忧上云