我无法通过m2Crypto和python验证SAML响应的断言的HMAC。我试图EVP.hmac
进行验证,但无法获得它工作。任何帮助表示赞赏。
我尝试使用EVP.HMAC
,EVP.hmac
和EVP.MessageDigest
来对断言进行哈希处理并将其与DigestValue进行比较,但这并没有给我积极的匹配。
我目前正在使用m2Crypto来从SAML响应中验证SAML签名,并且它可以按需工作。但这并不能验证Assedtion内容是否未在SignedInfo元素之外进行修改。
用于签名验证的现有代码:
此代码与关于m2Crypto和签名验证的许多其他问题非常相似(例如https://stackoverflow.com/a/17372895/3366016)。可以很好地验证响应的签名信息,但不能捕获对SAML响应其他方面的修改。
def verify_signature(signed_info, cert, signature):
"""
Coordinates the actual verification of the signature.
"""
x509 = X509.load_cert_string(base64.decodestring(cert), X509.FORMAT_DER)
pubkey = x509.get_pubkey().get_rsa()
verify_EVP = EVP.PKey()
verify_EVP.assign_rsa(pubkey)
verify_EVP.reset_context(md='sha256')
verify_EVP.verify_init()
verify_EVP.verify_update(signed_info)
return verify_EVP.verify_final(signature.decode('base64'))
MessageDigest示例:
assertion = get_tag(xml, 'Assertion')
assertion_str = ET.tostring(assertion, method='c14n', exclusive=True)
md = EVP.MessageDigest('sha256')
md.update(assertion_str)
md.final().encode('base64')
EVP.HMAC示例:
(此示例和下面的EVP.hmac示例给出的结果相同)
assertion = get_tag(xml, 'Assertion')
assertion_str = ET.tostring(assertion, method='c14n', exclusive=True)
h = EVP.HMAC('private_key', algo='sha256')
h.update(assertion_str)
h.final().encode('base64')
EVP.hmac示例:
assertion = get_tag(xml, 'Assertion')
assertion_str = ET.tostring(assertion, method='c14n', exclusive=True)
EVP.hmac('private_key', assertion_str, algo='sha256').encode('base64')