如何使用m2Crypto验证SAML HMAC以确保未修改响应?

时间:2019-04-04 14:10:05

标签: python saml-2.0 m2crypto

我无法通过m2Crypto和python验证SAML响应的断言的HMAC。我试图EVP.hmac进行验证,但无法获得它工作。任何帮助表示赞赏。

我尝试使用EVP.HMACEVP.hmacEVP.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')

0 个答案:

没有答案