Dot-Net
.NET 簽名的 XML 前綴
有沒有辦法在簽名 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 元素中的所有內容進行簽名,因此如果您在事後更新該元素,則簽名不再有效。您已經“篡改”了消息。