2013-06-20 64 views
1

我現在正在爲此苦苦掙扎整整一週,希望有人能幫助我。.Net 4.0 C#加載SHA256密鑰時SignatureAlgorithm更改爲SHA1

我需要使用SHA256和xmldsig簽名xml。 爲此,我使用SignedXML類。在研究這個類時,我發現它使用已加載密鑰的SignatureAlgorithm值來確定要使用的散列類型。

無論我如何加載密鑰(通過加載證書文件的cert存儲),它都會將SHA1顯示爲SignatureAlgorithm。 當我查看MMC證書商店中證書的詳細信息時,它將SHA256顯示爲SignatureAlgorithm。

我嘗試了openssl和makecert來生成SHA256證書密鑰,但兩者都將作爲SHA1載入.Net 並且因此signedXml.ComputeSignature();將使用SHA1作爲簽名方法

.net 4.0應該支持SHA256嗎?

+0

看看這裏:http://msdn.microsoft.com/en-us/library/system.security.cryptography.xml.signedinfo .signaturemethod.aspx,它可能只能處理SignedXML中的SHA-1。 – Dustin

回答

1

發現我可能使用了錯誤的類。

而不是Microsoft.Web.Services.Security.SignedXml應使用System.Security.Cryptography.Xml.SignedXml。 後者不使用使用的密鑰的SignatureAlgorithm來確定要使用的算法。 現在我可以用'SignedXml.SignedInfo.SignatureMethod'自己設置算法並使用SHA1鍵。

0

您必須聲明KeyedHashAlgorithm對象並傳遞對應於SHA256的字符串(文檔here)。

爲SHA256相應的字符串是HMACSHA256

然後此對象傳遞給ComputeSignature方法。

的代碼應該如下:
KeyedHashAlgorithm kha = KeyedHashAlgorithm.Create("HMACSHA256"); signedXml.ComputeSignature(kha);