Public-Key

在 xml 數字簽名中包含公共證書是否安全?

  • October 9, 2017

我對 XML 數字簽名的理解:

讓我們以 SAML 令牌為例。

注意 - 為了簡單起見,我省略了一些細節,如 CanonicalizationMethod、base64 編碼等。

為了讓我簽署<saml:Assertion>節點,我使用私鑰/公鑰對:

  1. 創建<saml:Assertion>塊的雜湊並將其儲存在節點<ds:Reference>內部。<ds:SignedInfo>
  2. 使用私鑰加密<ds:SignedInfo>節點並將其儲存在<ds:SignatureValue>節點中。
  3. 通過<ds:KeyInfo>塊中的公共證書。

然後驗證簽名:

  1. <ds:SignatureValue>使用在中找到的公共證書解密節點<ds:KeyInfo>並確保它等於<ds:SignedInfo>
  2. 確保節點的雜湊值<saml:Assertion>等於節點中儲存的摘要<ds:Reference>

我的問題:

我不明白的是,在我看來,這並沒有驗證發送者,它只是驗證節點中發送的公共證書的私鑰組件<ds:KeyInfo>是否用於簽署令牌。攻擊者可以創建自己的證書對並用它簽署令牌。

這種風險可能通過確保證書由證書頒發機構簽名來解決,但如果發送者使用自簽名證書,則驗證方不應使用在 中發送的公共證書<ds:KeyInfo>,而是從另一個受信任的來源獲取公共證書.

有人可以驗證或指出我是如何誤解 XML 數字簽名的嗎?

您遇到的問題是如何創建對公鑰所有權的信任。這是所有公鑰設置中的一個問題,並且與所使用的格式(如 XML 簽名)無關。

正如您所說的那樣,純簽名驗證只能檢查某些公鑰是否與用於簽署消息的私鑰匹配。在該步驟之後,您需要檢查您是否信任公鑰和(聲稱的)簽名者之間的所有權關係。

實踐中使用的信任模型有很多:

  1. 證書頒發機構您事先信任的機構(通常通過安裝在您的作業系統或軟體中的列表)簽署包含簽名者姓名和公鑰的證書
  2. 首次使用時信任每當您第一次與新實體通信時,您都會信任發送者的公鑰並儲存該關係
  3. Web of trust與 1 類似。您信任證書,因為您已經信任的其他人這樣做。
  4. 手動驗證您之前已通過某種帶外機制(例如比較手機上的密鑰指紋)手動檢查了發送方對密鑰對的所有權

引用自:https://crypto.stackexchange.com/questions/52119