Haciendo una integración con un proveedor de pagos en línea. El proveedor de pagos realizará una solicitud web a mi servidor para proporcionar información sobre el contenido de la cesta. Por mi parte, no hay procesamiento de pagos, solo necesito poder capturar la información de la canasta junto con la identificación del comerciante. El proveedor de pagos actuará en nombre de varios comerciantes de comercio electrónico al capturar y procesar los detalles de la tarjeta de crédito.
Requisitos de seguridad:
- Necesito poder verificar que una solicitud proviene de un determinado comerciante
- Necesito poder verificar que el mensaje no haya sido manipulado
- Necesito poder validar la marca de tiempo del cliente
Pocas alternativas que tengo.
-
Firma HMAC
- El proveedor de pagos genera una firma HMAC (SHA-256). (Con una clave de firma previamente acordada por Comerciante) StringToSign = MerchantId + BasketInfo + Timestamp
- El proveedor de pagos envía la firma anterior junto con MerchantId, BasketInfo y Timestamp en texto sin cifrar en una publicación HTTP.
- La firma se verifica en mi final
-
Cifrado de clave pública junto con cifrado simétrico
- SymmetricEncryptedText = AES_Encryption (BasketInfo + Timestamp) usando una clave de encriptación simétrica previamente acordada
- TextToPublicKeyEncrypt = MerchantId + SymmetricEncryptedText
- FinalEncryptedText = Cifrado de clave pública usando mi clave pública (TextToPublicKeyEncrypt) FinalEncryptedText se envía en HTTP Post
- En mi extremo, FinalEncryptedText se descifra usando mi clave privada. Esto me da acceso a MerchantId + SymmetricEncryptedText
- Descifre SymmetricEncryptedText usando la clave simétrica específica de MerchantId
-
Cifrado de clave simétrica
- StringToEncrypt = BasketInfo + marca de tiempo
- EncryptedText = AES Encryption (StringToEncrypt)
- MerchantId y EncryptedText lo envía el proveedor de pagos en HTTP Post
- EncryptedText se descifra usando la clave simétrica específica de MerchantId
Le agradezco que pueda arrojar algo de luz sobre la evaluación de estas opciones (o cualquier otra sugerencia). Todas las comunicaciones están utilizando SSL / TLS. Por lo tanto, un hombre en el ataque central puede ser descartado.
Las publicaciones HTTP se realizan a través de las páginas web de los clientes mediante una llamada AJAX de JavaScript. Por lo tanto, cualquier token generado utilizando los esquemas anteriores deberá generarse e incluirse en el JavaScript del lado del cliente. (Lo que permite que un usuario final pueda ver los tokens en la fuente de su página web)
En mi opinión, las opciones # 1 y # 3 son de la misma naturaleza. En la Opción # 2, debido al cifrado de clave pública, MerchantId no se muestra en texto sin formato en la fuente HTML del usuario. Pero, ¿realmente hace que # 2 sea más seguro debido a que MerchantId no está visible en la fuente HTML del usuario?
Disculpas de antemano por la larga pregunta. Déjame saber si hay alguna aclaración requerida.