当前位置: 首页 > 知识库问答 >
问题:

使用SHA256 SignedXml计算机签名

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

X509Certificate2 cert = new X509Certificate2(@"location of pks file", "password");
XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true;
doc.Load(@"input.xml");

SignedXml signedXml = new SignedXml(doc);
signedXml.SigningKey = cert.PrivateKey;
signedXml.SignedInfo.SignatureMethod = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";

// 
// Add a signing reference, the uri is empty and so the whole document 
// is signed. 
Reference reference = new Reference();
reference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
reference.AddTransform(new XmlDsigExcC14NTransform());
reference.Uri = "";
signedXml.AddReference(reference);

// 
// Add the certificate as key info, because of this the certificate 
// with the public key will be added in the signature part. 
KeyInfo keyInfo = new KeyInfo();
keyInfo.AddClause(new KeyInfoX509Data(cert));
signedXml.KeyInfo = keyInfo;
// Generate the signature. 
signedXml.ComputeSignature();

共有1个答案

傅英喆
2023-03-14

X509Certificate2将私钥从pfx文件加载到不支持SHA-256的Microsoft Enhanced Cryptographic Provider V1.0(提供程序类型1又名Prov_RSA_Full)中。

基于CNG的加密提供程序(在Vista和Server2008中引入)比基于CryptoAPI的提供程序支持更多的算法,但是.NET代码似乎仍然可以使用基于CryptoAPI的类,如rsacryptoServiceProvider,而不是rsacng,因此我们必须克服这些限制。

但是,另一个CryptoAPI提供程序Microsoft增强型RSA和AES加密提供程序(提供程序类型24又名prov_rsa_aes)支持SHA-256。所以如果我们把私钥放入这个提供程序,我们就可以用它签名了。

首先,您必须调整X509Certificate2构造函数,以便通过添加X509KeyStorageFlags.Exportable标志,使密钥能够从X509Certificate2放入的提供程序导出:

X509Certificate2 cert = new X509Certificate2(
    @"location of pks file", "password",
    X509KeyStorageFlags.Exportable);

并导出私钥:

var exportedKeyMaterial = cert.PrivateKey.ToXmlString(
    /* includePrivateParameters = */ true);

然后为支持SHA-256的提供程序创建新的rsacryptoServiceProvider实例:

var key = new RSACryptoServiceProvider(
    new CspParameters(24 /* PROV_RSA_AES */));
key.PersistKeyInCsp = false;
key.FromXmlString(exportedKeyMaterial);
signedXml.SigningKey = key;

现在它能起作用了。

下面是MSDN上提供程序类型及其代码的列表。

下面是示例的完整调整代码:

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

X509Certificate2 cert = new X509Certificate2(@"location of pks file", "password", X509KeyStorageFlags.Exportable);

// Export private key from cert.PrivateKey and import into a PROV_RSA_AES provider:
var exportedKeyMaterial = cert.PrivateKey.ToXmlString( /* includePrivateParameters = */ true);
var key = new RSACryptoServiceProvider(new CspParameters(24 /* PROV_RSA_AES */));
key.PersistKeyInCsp = false;
key.FromXmlString(exportedKeyMaterial);

XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true;
doc.Load(@"input.xml");

SignedXml signedXml = new SignedXml(doc);
signedXml.SigningKey = key;
signedXml.SignedInfo.SignatureMethod = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";

// 
// Add a signing reference, the uri is empty and so the whole document 
// is signed. 
Reference reference = new Reference();
reference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
reference.AddTransform(new XmlDsigExcC14NTransform());
reference.Uri = "";
signedXml.AddReference(reference);

// 
// Add the certificate as key info, because of this the certificate 
// with the public key will be added in the signature part. 
KeyInfo keyInfo = new KeyInfo();
keyInfo.AddClause(new KeyInfoX509Data(cert));
signedXml.KeyInfo = keyInfo;
// Generate the signature. 
signedXml.ComputeSignature();
 类似资料:
  • 问题内容: 我正在尝试编写一个脚本,如果命令满足一些要求,该脚本将关闭计算机 也尝试过 和其他一些。但是当我运行它时,什么也没有发生,计算机浏览代码不会崩溃或产生任何错误消息,并且可以正常终止脚本,而无需关闭计算机。 如何用python关闭计算机? 编辑: 似乎我尝试过的命令需要root访问权限。有没有办法在没有提升特权的情况下从脚本关闭计算机? 问题答案: 那里的许多Linux发行版都需要超级用

  • 1.1.1 计算机与计算 计算机是当代最伟大的发明之一。自从人类制造出第一台电子数字计算机,迄今已近 70 年。经过这么多年的发展,现在计算机已经应用到社会、生活的几乎每一个方面。人们用计 算机上网冲浪、写文章、打游戏或听歌看电影,机构用计算机管理企业、设计制造产品或从 事电子商务,大量机器被计算机控制,手机与电脑之间的差别越来越分不清,……总之计算 机似乎无处不在、无所不能。那么,计算机究竟是如

  • 问题内容: 我正在尝试使用HMAC-SHA256算法创建签名,这是我的代码。我正在使用美国ASCII编码。 我从上面的代码中得到的结果是: 这与Wiki中显示的相同 除外 的。 如果我做对了所有事情,或者可能可以改善我的代码,我正在寻找想法/意见。 问题答案: 0x仅表示其后的字符表示一个十六进制字符串。 因此,0x只是为了阐明输出的格式,而无需担心它。

  • 我在让AWS签名计算工作时遇到问题。目标是读取作为URL的一部分传递的4(键、日期戳、regionName、serviceName),并使用它们计算签名。我不是Node.js专家,非常感谢您的帮助和时间。 URL示例:http://localhost:3000/getSignature?key=ASIAJSLN6INQGFK7XX7Q 我的Node.js代码。。。 我收到以下运行时错误: Type

  • 我建立了一个tic_tac_toe(板)游戏对AI电脑播放器在java,我写了一个MiniMax算法的电脑 下面是我写的MiniMax算法: eval函数是用来计算网格的,我只是把它做成一个例子,下面是函数: 有人知道为什么会这样吗? 函数将获取此棋盘,并通过查找棋盘中的第一个空字符并放置“X”或“O”来尝试查找此棋盘的所有可能移动,这取决于玩家的回合,并返回新棋盘的列表,代码如下。

  • 本文向大家介绍ansible 使用Ansible设置远程计算机,包括了ansible 使用Ansible设置远程计算机的使用技巧和注意事项,需要的朋友参考一下 示例 我们可以使用Ansible设置远程系统。您应该有一个SSH密钥对,并且应该将SSH公钥带到计算机〜/ .ssh / authorized_keys文件中。您可以在未经任何授权的情况下登录。 先决条件: Ansible 您需要一个清单文