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