Dot-Net

.NET 簽名的 XML 前綴

  • November 25, 2021

有沒有辦法在簽名 XML 文件(.Net 中的 SignedXml 類)的簽名上設置前綴?

所以而不是:

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#>
...
</Signature>

我可以有以下內容:

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#>
...
</ds:Signature>

首先,確實沒有任何充分的理由這樣做。這兩種形式在功能上是等效的。任何表現良好的 XML 處理器都會以完全相同的方式處理它們。因此,除非您嘗試與未正確實現 XML 名稱空間的應用程序對話,否則最好 (IMO) 只保留預設表單。(即使在這種情況下,如果可能的話,最好還是修復錯誤的應用程序。)

也就是說,您可以使用 XPath 手動設置 SignedXml.GetXml() 返回的 XmlElement 及其子元素的前綴,如下所示:

XmlElement signature = signedXml.GetXml();
foreach (XmlNode node in signature.SelectNodes(
   "descendant-or-self::*[namespace-uri()='http://www.w3.org/2000/09/xmldsig#']"))
{
   node.Prefix = "ds";
}

這是不可能的。如果您在簽名後修改 XML,則可能無法驗證,如上例所示。IMO 這是您必須忍受的 MSFT 數字簽名實施中的一個缺陷。

很多人會說沒有理由這樣做,他們在技術上是正確的。但是,當您與大型供應商(即州政府或銀行)打交道時,祝他們最終改變它。大多數參考實現都包含它。

更新:簽名對 SignedInfo 元素中的所有內容進行簽名,因此如果您在事後更新該元素,則簽名不再有效。您已經“篡改”了消息。

引用自:https://stackoverflow.com/questions/381517