如何在不使用SignedXml的情况下验证c#中的xml数字签名?
如何在不使用SignedXml(dotnet core中不可用)的情况下验证xml签名(用于SOAP请求) 我试着这样做,但它总是给我错误的印象:如何在不使用SignedXml的情况下验证c#中的xml数字签名?,c#,cryptography,.net-core,xml-signature,C#,Cryptography,.net Core,Xml Signature,如何在不使用SignedXml(dotnet core中不可用)的情况下验证xml签名(用于SOAP请求) 我试着这样做,但它总是给我错误的印象: public static void CheckSignature(XElement responseXml, MyResponseType response) { string originalDigestValue = Convert.ToBase64String(response.Signature.SignedInf
public static void CheckSignature(XElement responseXml, MyResponseType response)
{
string originalDigestValue = Convert.ToBase64String(response.Signature.SignedInfo.Reference.FirstOrDefault().DigestValue);
var originalSignatureValue = response.Signature.SignatureValue.Value;
X509DataType certificateData = (X509DataType)response.Signature.KeyInfo.Items[0];
X509Certificate2 certificate = new X509Certificate2((byte[])certificateData.Items[0]);
//for calculating digest value
//responseXml.Descendants(nm + "Signature").SingleOrDefault().Remove();
//var digestValue = Convert.ToBase64String(SHA1.Create().ComputeHash(System.Text.Encoding.UTF8.GetBytes(responseXml.Document.ToString())));
XNamespace nm = @"http://www.w3.org/2000/09/xmldsig#";
var signedInfoNode = responseXml.Descendants(nm + "SignedInfo").SingleOrDefault();
var signedInfo = signedInfoNode.ToString().Trim();
byte[] signedInfoBytes = Encoding.UTF8.GetBytes(signedInfo);
var hash = SHA1.Create().ComputeHash(signedInfoBytes);
RSA rsa = certificate.GetRSAPublicKey();
try
{
Console.WriteLine("Signed Info: \n" + signedInfo);
Console.WriteLine("Verification: \n" + rsa.VerifyData(signedInfoBytes, originalSignatureValue, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1));
Console.WriteLine("Verification hash: \n" + rsa.VerifyData(hash, originalSignatureValue, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1));
}
catch (Exception exc)
{
//
}
}
是一个非常大、非常复杂的规范。如果您愿意,可以尝试实现它,复杂的部分是将XML文档转换为字节以进行签名和验证(是独立的、大的)
SignedXml现在应该可以使用了,升级肯定是最简单的选择。是一个非常大、非常复杂的规范。如果您愿意,可以尝试实现它,复杂的部分将XML文档转换为字节,用于进行签名和验证(是独立的,而且很大)
SignedXml现在应该可以使用了,升级肯定是最简单的选择。您看过“我做过”了吗,但是有太多类型在dotnet core 1.1中还没有。您看过“我做过”了吗,但是有太多类型在dotnet core 1.1中还没有。