Как использовать m2Crypto для проверки SAML HMAC, чтобы убедиться, что ответ не был изменен? - PullRequest
0 голосов
/ 04 апреля 2019

У меня проблемы с проверкой HMAC подтверждения ответа SAML с помощью m2Crypto и python. Я пытаюсь EVP.hmac проверить это, но не могу заставить его работать.Любая помощь приветствуется.

Я пытался использовать EVP.HMAC, EVP.hmac и EVP.MessageDigest для хеширования утвержденияи сравните его с DigestValue, но это не дает мне положительного совпадения.

В настоящее время я использую m2Crypto для проверки подписи SAML из ответа SAML, и она работает как нужно.Но это не подтверждает, что содержимое утверждения не было изменено вне элемента 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')
...