【问题标题】:How to verify xml digital signature in c# without using SignedXml?如何在不使用 SignedXml 的情况下验证 c# 中的 xml 数字签名?
【发布时间】:2017-06-07 17:59:59
【问题描述】:

如何在不使用 SignedXml(在 dotnet 核心中不可用)的情况下验证 xml 签名(用于 SOAP 请求)?

我正在尝试这样,但它总是给我错误:

 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)
        {
           //
        }
    }

【问题讨论】:

标签: c# cryptography .net-core xml-signature


【解决方案1】:

xmldsig 是一个非常庞大、非常复杂的规范。如果您愿意,您可以尝试实现它,复杂的部分是将 XML 文档转换为字节以进行签名和验证(canonicalization (or c14n) spec 是独立的,而且很大)。

SignedXml 现在应该可以通过.NET Core 2.0 Preview 1 获得,升级绝对是您最容易的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2013-06-02
    • 2017-10-11
    • 1970-01-01
    相关资源
    最近更新 更多