阐明 RSA SAML 响应

Clarify RSA SAML Response

我不太清楚如何检查和解析 SAML 2.0 中这个部分响应信封传递的值:

<dsig:Signature xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
    <dsig:SignedInfo><dsig:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#WithComments"/><dsig:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
        <dsig:Reference URI="#ID_ce8c62aa-08e4-4a21-a89a-af4fbd7a9f50">
            <dsig:Transforms><dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
            <dsig:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
            </dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
            <dsig:DigestValue>ImUVGjTf7WTCmboAbAtjx7WKQhI=</dsig:DigestValue>
        </dsig:Reference>
    </dsig:SignedInfo>
    <dsig:SignatureValue>CDk+O/3PPh57l84pjFW0xwiPYJ+yinYJciBowT3nkPaAXeMYCH1AopZl7ZP+swPiK+oYuW9STPSlJVuEuDao5VbSU2WlQR7Ed9nZMt9PNY19/eKtkAqbMk01ZY8YH6OyTQm17w6IzNRbY4sJcHSRz9eDUsTzAYVhV9PEBgT1ouZsghklMCe0iYBjK5LmRS88jGmCN5sZ5+L8+KimTCakWSJ8CLntEAFx1SBL50Or4e8j6nHiW7g==</dsig:SignatureValue>
    <dsig:KeyInfo>
        <dsig:KeyValue>
            <dsig:RSAKeyValue>
                <dsig:Modulus>4Gvzu2dCYGhdWr9Er/WtgbWRqAR798IPCfAubx8NeBKG/X6P7sM91zbD2LEH4tJS2vkMCnQFidoLdeh1SHp7+GLHnVsgTcj6NPOit0EOHz10tdRmFMwoRCh5hcMFEisFUgSdaS8bO2wSXBmLENfLDUOSYKKLP0JGtTqnAZ0A99UNrVWKemx/EnHopH+Q7M+zmbj8VWFVlCK6rDfXJLUBr+kGSlw==</dsig:Modulus>
                <dsig:Exponent>AQAB</dsig:Exponent>
            </dsig:RSAKeyValue>
        </dsig:KeyValue>
    </dsig:KeyInfo>
</dsig:Signature>

所以基本上 RSAKeyValue 应该包含 "public key" 来读取 DigestedValue? 那么 Signature 值的用途是什么?

我想实现一个 Java class 来解密(我有正确的密钥库并传递给它...)。请给我指明正确的方向。

如评论中所写,它是 XML signature。签名允许您验证 XML 是否已由可信方签名且元素未被修改。因此,您可以相信 SAML 响应确实来自您可以信任的 IdP。这不是加密。

I would like to implement a Java class to decrypt

正如我所说,没有什么可解密的,您只能验证已签名 XML 元素的完整性。

为此,我建议您使用开箱即用的库来处理 XML(实现所有规范化选项等会很无聊)。我建议您使用开箱即用的库(OpenSAML,spring-security-saml2)来验证签名。

如果您想自己做,只需阅读 search/about XML 签名。

你有什么:

<dsig:Reference URI="#ID_ce8c62aa-08e4-4a21-a89a-af4fbd7a9f50">

您的 XML 中必须有一个 id 属性为 "#ID_ce8c62aa-08e4-4a21-a89a-af4fbd7a9f50" 的元素,并且签名确保引用的 XML 元素的完整性。确保签名引用了整个 SAML 消息或断言元素。否则,您的代码将容易受到 签名注入攻击 。这就是为什么我建议您为此使用成熟的库。

<dsig:DigestValue>ImUVGjTf7WTCmboAbAtjx7WKQhI=</dsig:DigestValue>

RSA 不适用于任意(任意)长度的消息,因此会创建消息摘要(sha-1 哈希)并对其进行签名。 DigestValue 是从已签名的 XML 元素及其内容创建的散列值。 (如何创建一个完整的内容进行哈希取决于CanonicalizationMethod、Transforms、DigestMethod中声明的参数,您可以在第一篇阅读link)

<dsig:SignatureValue>

这是 DigestValue

的 RSA/PKCS1.5 签名

我希望这能澄清你的问题。