Cifrado de parámetros RSA OAEP y PKCS1

El cifrado de parámetros es un método extra de seguridad, el cuál permite cifrar las credenciales de los usuarios mediante una llave pública vinculada a la API KEY.

Tipos
Actualmente el API soporta dos tipos de “padding”:

  • oaep
  • pkcs1

Parámetros

Para poder enviar el valor cifrado de un parámetro hay que agregar el sufijo /rsa-oaep o /rsa-pkcs1 a cada uno de los parámetros que se desea proteger, según sea el caso.
Si normalmente enviamos los parámetros de la siguiente manera:


    var payload = {
        "id_site": "56cf5728784806f72b8b4568",
        "username": "test",
        "password": "mypassword"
}

Para poder enviarlo cifrado se le tiene que agregar un sufijo al parámetro original, tomando el ejemplo anterior quedaría de la siguiente manera:


  var payload = {
        "id_site": "56cf5728784806f72b8b4568",
        "username": "test",
        "password/rsa-pkcs1": "L7TnJadaitE+RfFTsDr6G4VtEG..."
};

Transporte

Para poder transportar un valor cifrado hay que encapsular su valor en base64:


var password = "mypassword";

password = myEncryptFunction(password);

password = base64_encode(password);

Multiples parámetros
Se pueden cifrar uno o más parámetros en cada petición, aunque para reducir el tamaño de la petición se recomienda usar un parámetro especial payload/rsa-oaep o payload/rsa-pcks1 en donde su contenido es una representación JSON en un string con todos los parámetros adentro.



Este sería un ejemplo no optimizado:


var payload = {
      "id_site": "56cf5728784806f72b8b4568",
      "username/rsa-oaep": "X9e21uGBN3Z10kx3EP151GFQd9...",
      "password/rsa-pkcs1": "L7TnJadaitE+RfFTsDr6G4VtEG..."
};



Este sería un optimizado:

var credential = {
    "username": "test",
    "password": "mypassword"
};

credential = JSON.stringify(credential);
credential = myEncryptFunction(credential);
credential = base64_encode(credential);

var payload = {
“id_site”: “56cf5728784806f72b8b4568”,
“payload/rsa-pkcs1”: credential
};



Ejemplos:

Ejemplo para cifrar via linea de comandos (Linux o macOS)


echo "mypassword" | openssl rsautl -encrypt -pkcs -pubin -inkey production_pub.key | openssl base64




Ejemplo cURL de una petición al API


curl -d '{"api_key":"{{ valor de api key}}","password\/rsa-pkcs1":"{{ base64 url safe}}"}' -H 'Content-Type: application/json' -k https://sync.paybook.com/v1/send_values





Ejemplo de una petición al API

Peticion:


PeticionCifrado




Respuesta:






Nota: El endpoint /send_values es un endpoint que nos ayudará a probar que este funcionando correctamente, una vez que se valide que funciona el cifrado se debe de enviar al endpoint de /credentials para seguir el flujo de creación de credenciales.

1 me gusta

Hola buenas tardes como puedo obtener la llave pública vinculada a la API KEY ? Se descarga del portal ? O hay un proceso para generarla ? Gracias

Hola, muy buen día.

Nosotros te proporcionados la llave pública, podrías ponerte en contacto con [email protected] y con gusto te apoyamos.

Saludos.

2 Me gusta

Hola, buen día!

El método /send_values retorna mensajes de error en caso de que la apiKey sea inválida?, o si el username/password están cifrados incorrectamente?

Saludos.

Hola @alcala1996amaro muy buen día.

No, en el endpoint/send_values si alguno de los dos casos sucede el value del parámetro “cifrado” no tendría como descifrarse y se retornaría como tal el valor enviado.

Ejemplo (API Key no válida):

Petición


{
    "api_key":"12345a12345",
    "id_site": "56de2130784806d7028b4589",
    "username": "test",
    "password\/rsa-pkcs1":"bfjoL/gV9KbuuUbAwLxYzM80TW/klEilF8nuQ4WYbFUMXqxENcQZSzkAxMs817oyj8TTzLQWGhCv4kHVwHp5ZUxidao2DnuhNKe0HsLbl2lYPUEtm0NKUuwGcXuIpTVNdwbIgRk16RABTczJocIRgriTWP2b/jjEB44zzcAa73tq8thcNF3rVVoYrB1gUA/BW2H7D3i0PLUn4ob3rKTFj6KEwKDmdcKVn3jexe3QWvu881XAPD1m2GV2hS8N6c9eZR91fU/nJoII9PX3SXxvpTxyMmYatZk8Po3Xm0LoMlCXeVmhgyQVqZyC5R57Ro8hCp4tlSKCcO7UbAlE7kMJoXoe7l/21Co5iGlSiexuJ9/GPGUa8tbbG83aVmaa0LDEeMIqV/djO8Nhf6c349/NaJrAcsUP783ypg0XyHGcs/MBdLgfSoY4YJPi8lDRzCGIjo0fuMx5vCpVqIVd5LHCBEOylLpy3k78DM0xEqVsM1MXtSeDW3MbbIsdUSSZAR5i4OHQonQSHRJQEcJjpOizU3DKHowgo1naw6jpUl5ZcwGgwCYAMjWZ6t8mM6wnij+dJ91hN2oLacH2hocxd6e/BeEGPgxOiaVEJm5b3q8qKSe80xL1t8Hr4F3XELwqDIZD/EPikRsxPGBZmW4p4tETK8vXJgH9nEWTtoUDxRaf7G4=" 
}

Respuesta:


{
    "rid": "d25b4dbf-2b9f-41b7-bbe0-42aaa8a7a192",
    "code": 200,
    "errors": null,
    "status": true,
    "message": null,
    "response": {
        "content_type": "application/json",
        "method": "POST",
        "parameters": {
            "api_key": {
                "method": "JSON",
                "value": "12345a12345",
                "ofuscate": null
            },
            "id_site": {
                "method": "JSON",
                "value": "56de2130784806d7028b4589",
                "ofuscate": null
            },
            "username": {
                "method": "JSON",
                "value": "test",
                "ofuscate": null
            },
            "password/rsa-pkcs1": {
                "method": "JSON",
                "value": "bfjoL/gV9KbuuUbAwLxYzM80TW/klEilF8nuQ4WYbFUMXqxENcQZSzkAxMs817oyj8TTzLQWGhCv4kHVwHp5ZUxidao2DnuhNKe0HsLbl2lYPUEtm0NKUuwGcXuIpTVNdwbIgRk16RABTczJocIRgriTWP2b/jjEB44zzcAa73tq8thcNF3rVVoYrB1gUA/BW2H7D3i0PLUn4ob3rKTFj6KEwKDmdcKVn3jexe3QWvu881XAPD1m2GV2hS8N6c9eZR91fU/nJoII9PX3SXxvpTxyMmYatZk8Po3Xm0LoMlCXeVmhgyQVqZyC5R57Ro8hCp4tlSKCcO7UbAlE7kMJoXoe7l/21Co5iGlSiexuJ9/GPGUa8tbbG83aVmaa0LDEeMIqV/djO8Nhf6c349/NaJrAcsUP783ypg0XyHGcs/MBdLgfSoY4YJPi8lDRzCGIjo0fuMx5vCpVqIVd5LHCBEOylLpy3k78DM0xEqVsM1MXtSeDW3MbbIsdUSSZAR5i4OHQonQSHRJQEcJjpOizU3DKHowgo1naw6jpUl5ZcwGgwCYAMjWZ6t8mM6wnij+dJ91hN2oLacH2hocxd6e/BeEGPgxOiaVEJm5b3q8qKSe80xL1t8Hr4F3XELwqDIZD/EPikRsxPGBZmW4p4tETK8vXJgH9nEWTtoUDxRaf7G4=",
                "ofuscate": null
            }
        }
    }
}
1 me gusta