.net-4.5 – 如何使用SHA256检查签名的XML文档的签名?

似乎SignedXml.CheckSignature只对使用SHA1的签名文档工作正常.

我通过添加算法SHA256尝试了this code,CheckSignature工作正常,但WIF类开始抛出以下异常:

System.Security.Cryptography.CryptographicException:指定的无效算法.在这方法调用
System.IdentityModel.Services.FederatedPassiveSecurityTokenServiceOperations.ProcessSignInRequest

看来ProcessSignInRequest使用的算法SHA1在内部被覆盖:

CryptoConfig.AddAlgorithm(typeof(RSAPKCS1SHA256SignatureDescription),"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256");

我错过了什么?如何在CheckSignature中指定算法?

今天我也有同样的问题.原来,WIF签名证书是使用没有SHA256支持的CSP生成的( more details).

我浏览了System.IdentityModel源代码,并发现它包含对这种情况的特殊处理.当您具有全局注册的相应算法时,WIF使用它而不是内部实现,RSAPKCS1SHA256SignatureDescription类不包括此特殊处理.

所以我做了我自己的SignatureDescription实现,它使用认参数重新创建了RSACryptoServiceProvider,其中包括SHA256支持.

/// <summary>
/// Represents the sha256RSA signature algorithm.
/// </summary>
public sealed class RsaPkcs1Sha256SignatureDescription : SignatureDescription
{
    /// <summary>
    /// This type of CSP has SHA256 support
    /// </summary>
    private const int PROV_RSA_AES = 24;

    public RsaPkcs1Sha256SignatureDescription()
    {
        KeyAlgorithm = typeof(RSACryptoServiceProvider).FullName;
        DigestAlgorithm = typeof(SHA256Cng).FullName;
        Formatteralgorithm = typeof(RSAPKCS1SignatureFormatter).FullName;
        Deformatteralgorithm = typeof(RSAPKCS1SignatureDeformatter).FullName;
    }

    /// <summary>
    /// Adds support for sha256RSA XML signatures.
    /// </summary>
    public static void RegisterForSignedXml()
    {
        CryptoConfig.AddAlgorithm(
            typeof (RsaPkcs1Sha256SignatureDescription),"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256");
    }

    public override asymmetricSignatureDeformatter CreateDeformatter(asymmetricAlgorithm key)
    {
        if (key == null) throw new ArgumentNullException("key");

        key = GetSha2CompatibleKey(key);

        var signatureDeformatter = new RSAPKCS1SignatureDeformatter(key);
        signatureDeformatter.SetHashAlgorithm("SHA256");
        return signatureDeformatter;
    }

    public override asymmetricSignatureFormatter CreateFormatter(asymmetricAlgorithm key)
    {
        if (key == null) throw new ArgumentNullException("key");

        key = GetSha2CompatibleKey(key);

        var signatureFormatter = new RSAPKCS1SignatureFormatter(key);
        signatureFormatter.SetHashAlgorithm("SHA256");
        return signatureFormatter;
    }

    // Some certificates are generated without SHA2 support,this method recreates the CSP for them.
    // See https://stackoverflow.com/a/11223454/280778
    // WIF handles this case internally if no sha256RSA support is installed globally.
    private static asymmetricAlgorithm GetSha2CompatibleKey(asymmetricAlgorithm key)
    {
        var csp = key as RSACryptoServiceProvider;
        if (csp == null || csp.CspKeyContainerInfo.ProviderType == PROV_RSA_AES)
            return key;

        var newKey = new RSACryptoServiceProvider(new CspParameters(PROV_RSA_AES));
        newKey.ImportParameters(csp.ExportParameters(true));
        return newKey;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇