[英]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
应该包含“公钥”以读取DigestedValue
吗? 那么, Signature
值的目的是什么?
我想实现一个Java类来解密(我有正确的密钥库并通过传递它来做...)。 请指出正确的方向。
如注释中所写,它是XML签名 。 通过签名,您可以验证XML是否已由受信任方签名并且元素没有被修改。 因此,您可以相信SAML响应确实来自您可以信任的IdP。 它不是加密。
我想实现一个Java类来解密
正如我所说的,没有什么要解密的,您只能验证签名的XML元素的完整性。
为此,我建议您使用现成的库来处理XML(实现所有规范化选项等会很无聊。)。 我建议您使用现成的库(OpenSAML,spring-security-saml2)来验证签名。
如果您想自己做,只需阅读搜索/关于 XML签名的信息。
您所拥有的:
<dsig:Reference URI="#ID_ce8c62aa-08e4-4a21-a89a-af4fbd7a9f50">
XML中必须具有ID属性为"#ID_ce8c62aa-08e4-4a21-a89a-af4fbd7a9f50"
的元素,并且签名可确保所"#ID_ce8c62aa-08e4-4a21-a89a-af4fbd7a9f50"
XML元素的完整性。 确保签名引用了整个SAML消息或声明元素。 否则,您的代码将容易受到签名注入攻击 。 这就是为什么我建议您为此使用成熟的库。
<dsig:DigestValue>ImUVGjTf7WTCmboAbAtjx7WKQhI=</dsig:DigestValue>
RSA无法处理任意(任何)长度的消息,因此将创建消息摘要(sha-1哈希)并进行签名。 DigestValue
是从已签名的XML元素及其内容创建的哈希值。 (如何创建要散列的全部内容取决于CanonicalizationMethod,Transforms,DigestMethod中指定的参数,您可以在第一个链接中阅读该参数)
<dsig:SignatureValue>
这是DigestValue的RSA / PKCS1.5签名
我希望可以澄清您的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.