我正在读这个IBM Developer Works SAML article,你可以在下面看到两种不同的签名/摘要算法:sha1和sha256。我很好奇为什么两个都被列出,以及哪种方法签署了什么。那篇文章说,“[IdP]将散列算法应用于Assertion元素的内容。”那似乎是sha256,但是为什么要提到DigestMethod sha1?如果两种方法都散列相同的内容,当sha1是DigestMethod时,服务提供商(SP)如何知道使用sha256验证签名?
这是StackOverflow post正确的解释吗?
... DigestMethod Algorithm元素引用它们的父Reference元素。您可以为多个Reference元素使用不同的DigestMethod算法,并使用不同的SignatureMethod算法对所有引用进行散列和签名。
<saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
ID="Assertion1487321564650" IssueInstant="2017-02-17T08:52:44.650Z"
Version="2.0">
<saml2:Issuer>samlsso.sample.net</saml2:Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod
Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
<ds:Reference URI="#Assertion1487321564650">
<ds:Transforms>
<ds:Transform
Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<ds:DigestValue>nKYxEAMG1LY4H+LqR22KJ/vqyb8=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
m5V44OFKU1PMdibileobvVVA8NVZMKRmKAauOin2f+Kr1WQ [...] Z/5JcU/qw==
</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>
MIIDRzCCAi+gAwIBAgIEKa/crTANBgkq
答案 0 :(得分:0)
XML元素SignedInfo
是使用私钥和SHA-256签名的内容。未显示的是实际的签名算法,但是如果你查找rsa-sha256,那么你会发现它使用PKCS#1 v1.5签名方案而不是新的PSS。
此SignedInfo
包含对签名数据的引用,转换(规范化)和签名数据的签名值。这不是常规签名生成中的数据的一部分;只能包含哈希值。因此,元信息也被签名。 SignedInfo
中可以有多个引用和不同类型的转换。
当然,引用本身必须与数据的哈希一起签名;否则你可以在两个数据块被散列时切换数据。
但是,您仍应验证散列是否超出了应用程序中的正确数据。否则,您将验证XML中的某些数据,同时处理完全不同的数据。这当然应该由SAML实现来执行。
当然可以从the XML-digsig standard检索更多信息。
是的,链接到StackOverflow的帖子是正确的。
我不会惋惜使用SHA-1来计算数据的哈希值。 SHA-1已被破坏,不应再使用了;当然不适用于数据哈希或签名生成。