2010-02-02 135 views
7

我有一位發送安全密鑰的客戶。他們使用的加密是三重DES。他們發送的每個聲明都有一個需要驗證的簽名值,以賦予他們必要的權限。你能給我一個這樣做的示例代碼嗎?如何驗證SAML簽名值

+0

@king - 你的平臺是什麼? java嗎? C#? PHP的?請詳細說明,以便示例/答案適用。 – 2010-02-02 16:32:23

+0

使用opensaml的java – stu 2011-10-11 19:28:39

回答

13

加密和簽名是兩種不同的動物。三重DES是一種對稱密鑰方法(用於加密和解密的相同密鑰)。另一方面,數字簽名使用非對稱密鑰(私鑰/公鑰對),其中籤名是使用私鑰計算的,並且可以使用公鑰進行驗證。因此,如果您的客戶想要將簽名以XML格式發送給您,那麼他們需要爲您提供公鑰。

對於加密,SAML中典型的是使用XMLEncryption,它定義了一種XML格式,用於在SAML消息中包含加密密鑰信息和加密數據。由於靜態對稱密鑰的交換是有問題的 - 如果它被攔截,攔截器可以對任何消息進行加密和解密 - 可以做的是使用爲每個消息重新生成的動態對稱密鑰,使用加密消息然後使用私鑰/公鑰加密密鑰對的公鑰對該密鑰進行加密,並將其與消息一起發送。加密的對稱密鑰只能使用用於加密密鑰對的專用一半來解密。

因此,從關鍵的角度來看,最重要的差異在於簽名時,客戶持有私鑰並且必須與您共享公鑰,而對於加密,您持有私鑰並必須共享公共密鑰關鍵與客戶。

5

如果您想驗證的SAML斷言或任何可簽名XML對象的簽名,則OpenSAML WIKI提供了更多信息:

https://wiki.shibboleth.net/confluence/plugins/viewsource/viewpagesrc.action?pageId=3277047

你可以找「簽名驗證的例子」。

本博客文章也有一個例子,以及:

http://mylifewithjava.blogspot.com/2012/11/verifying-signatures-with-opensaml.html

要獲得「證書」的驗證,在這裏看到: http://mylifewithjava.blogspot.com/2011/03/getting-credentials-in-opensaml.html

有關如何來解讀XML爲信息打開SAML對象,看到這裏: https://wiki.shibboleth.net/confluence/display/OpenSAML/OSTwoUsrManJavaCreateFromXML

謝謝, Yogesh

+0

我在我的新書「OpenSAML指南」中詳細解釋了所有這一切,https://gumroad.com/l/a-guide-to-opensaml – 2015-06-18 10:14:50

+0

不幸的是, t似乎涵蓋了如何從SAML中的Signature構造「憑證」(由SignatureValidator()函數使用)。 – GrandAdmiral 2017-01-10 21:03:23