Verificación del signature
Introducción
El incluir una firma en la respuesta del Charges para el flujo autorización, tiene como finalidad reforzar la seguridad y garantizar la integrad de los datos transmitidos hacia el comercio a traves de un redireccionamiento o una notificación ServerToServer.
Datos de la llave privada:
Key Type: Asymmetric
Key Spec: RSA_2048
Key Length: 2048 bits
Key Usage: Sign and verify
Signing algorithm:
SHA512withRSA
Longitud de la firma signature
, considerar hasta una longitud de 512
A continuación se muestra los pasos para la validación de la firma.
Paso 1: Identificar los Campos a Cifrar
Flujo Redireccionamiento
En este flujo, el comercio recibe dos parámetros en el redireccionamiento(signature
- authorization_result
). El parámetro authorization_result
es un JSON en Base64 con contiene el resultado de la autorización que será usado como el campo a cifrar para luego compararlo con el parámetro signature
.
Flujo notificación ServerToServer
En este flujo, el comercio recibe una petición REST donde el body es en el resultado de la autorización, y en el header viaja el signature
. El body será usado como el campo a cifrar para luego compararlo con el parámetro signature
.
Paso 2: Verificar el signature
En el proceso de validación, todos los comercios emplearán la llave pública proporcionada por Alignet para verificar la firma digital. La verificación de la firma implica comparar el valor(resultado de la autorización) generado con el signature
recibido del CHARGES
.
Llave Publica:
Ambiente | Llave PEM | Llave Publica |
---|---|---|
PRE-PRODUCCIÓN |
| |
PRODUCCIÓN |
|
|
Ejemplo
Python
import json
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.serialization import load_pem_public_key
from cryptography.exceptions import InvalidSignature
def verify_rsa_signature(public_key_pem, authorization_result, signature):
# Convertir la clave pública en formato PEM a un objeto de clave
public_key = load_pem_public_key(public_key_pem.encode('utf-8'))
# Convertir el mensaje a bytes
message_bytes = authorization_result.encode('utf-8')
try:
# Verificar la firma usando PKCS#1 v1.5 y SHA-512
public_key.verify(
signature,
message_bytes,
padding.PKCS1v15(),
hashes.SHA512()
)
return True
except Exception:
return False
if __name__ == "__main__":
print("VALIDAR FIRMA")
public_key_pem = """""" #LLAVE ENTREGADA EN LA DOCUMENTACION
signature = base64.b64decode("SIGNATURE")
message = "" #RESULTADO DE LA AUTORIZACION. En caso de la notificacion ServerToServer, aplicar json.dumps()
result = verify_rsa_signature(public_key_pem, message, signature)
print(f'Firma valida: {result}')