У меня проблемы с проверкой 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')