2017-09-06 40 views
2

我需要使用RSA-SHA1算法對XML文檔的其中一個節點進行簽名(並最終驗證)。 w3.org link如何使用RSA-SHA1算法簽名xml元素?

RSA-SHA1 URI:
http://www.w3.org/2000/09/xmldsig#rsa-sha1
中指定:
節6.4.2 [XMLDSIG-CORE2002]

我下面this example,但想不通怎麼改要求的算法。

簽名產生髮生在這裏:

signedXml.ComputeSignature(); 

與參數的唯一覆蓋預計KeyedHashAlgorithm

public void ComputeSignature(KeyedHashAlgorithm macAlg);link

KeyedHashAlgorithmlink)又只允許創建HMAC *和MAC *算法,並且沒有RSA-SHA1。

在.NET中用RSA-SHA1簽署XML最無痛的方式是什麼?

編輯:

我試圖用一個X509證書提取的關鍵。證書的簽名算法屬性是sha1RSA

這是我如何分配給它:

var signedXml = new SignedXml(xmlDoc); 
... 
signedXml.SigningKey = (RSACryptoServiceProvider)cert.PrivateKey; 
... 
signedXml.ComputeSignature(); 

產生的簽名XML格式匹配預期之一,然而digestsignature值無效。

回答

2

在.NET Framework 1.1到.NET Framework 4.7中,只需將signedXml.SigningKey設置爲RSA密鑰對象即可獲得RSA-SHA-1。

如果安裝了.NET 4.7.1(當前處於預覽狀態),則RSA的默認值將更改爲RSA-SHA-2-256,每https://github.com/Microsoft/dotnet/blob/master/releases/net471/dotnet471-changes.md

所以,如果你真的想要一個RSA-SHA-1的簽名,你需要

一)設置signedXml.SigningKey到RSA密鑰

二)設置signedXml.SignedInfo.SignatureMethod = SignedXml.XmlDsigRSASHA1Url

(包括調用signedXml.ComputeSignature()之前)相反,如果您想在當前版本上做比RSA-SHA-1更好的設置,請將signedXml.SignedInfo.SignatureMethod設置爲SignedXml.XmlDsigSHA256Url或更高版本。


警告詞:SHA-1在加密時被認爲是破碎的,現在已發現碰撞。雖然它不夠普遍(在這一點上)攻擊任意的XML,但它可能會長到這一點。你真的不應該使用任何新的SHA-1,並且應該考慮在決定是否接受簽名文檔時考慮驗證你的簽名方法比SHA-1更好。

+0

@ user5226582 Ah,SignedXml.SignatureMethod是可寫SignedXml.SignatureInfo.SignatureMethod的只讀投影。修復了答案。 – bartonjs

+0

幫助,非常感謝! – user5226582