¿Quieres un ejemplo más específico? Si, por favor ¡Perfecto! Aquí te dejo un ejemplo más específico para firmar electrónicamente un JSON con **PHP** utilizando las funciones de `openssl`. Supongamos que estás trabajando desde un **hosting compartido con cPanel** y tienes acceso a tus claves privadas, públicas y certificado. --- ### **Ejemplo Completo: Firmar JSON en PHP con OpenSSL** #### **1. Estructura del Proyecto** - Crea una carpeta en tu servidor (por ejemplo, `firma_json`) con la siguiente estructura: ``` firma_json/ ├── PrivateKey.key # Tu clave privada ├── PublicKey.key # Tu clave pública ├── Certificate.crt # Tu certificado (si es necesario) ├── firmar.php # Script PHP para firmar el JSON ``` #### **2. Código PHP (`firmar.php`)** ```php json_decode($json, true), // El JSON original 'signature' => $signatureBase64 // Firma en formato Base64 ]; // 5. Mostrar el JSON firmado header('Content-Type: application/json'); echo json_encode($signedJson, JSON_PRETTY_PRINT); // Verificación (Opcional) $publicKey = file_get_contents($publicKeyPath); if (!$publicKey) { die('No se pudo cargar la clave pública.'); } // Verificar la firma con la clave pública $verification = openssl_verify($json, base64_decode($signatureBase64), $publicKey, OPENSSL_ALGO_SHA256); if ($verification === 1) { echo "\nLa firma es válida.\n"; } elseif ($verification === 0) { echo "\nLa firma es inválida.\n"; } else { echo "\nError al verificar la firma.\n"; } ?> ``` --- ### **Cómo Funciona el Código** 1. **Carga de la Clave Privada:** Se utiliza `file_get_contents()` para leer la clave privada desde el archivo `PrivateKey.key`. 2. **Firma del JSON:** La función `openssl_sign` genera la firma digital del JSON usando la clave privada y el algoritmo `SHA256`. 3. **Firma en Base64:** La firma generada se codifica en Base64 para poder enviarla junto con el JSON firmado. 4. **Verificación (Opcional):** El receptor puede usar la clave pública (`PublicKey.key`) para verificar la autenticidad de la firma. 5. **Salida del JSON Firmado:** El JSON firmado tiene esta estructura: ```json { "data": { "usuario": "test", "monto": 100, "moneda": "USD" }, "signature": "MIIBOg..." } ``` --- ### **Verificación de la Firma en el Receptor** Si el receptor desea verificar la firma, debe usar la clave pública (`PublicKey.key`) con el siguiente código PHP: ```php ``` --- ### **Desafíos y Recomendaciones** 1. **Almacenamiento Seguro:** - **Claves Privadas:** Asegúrate de almacenar tu `PrivateKey.key` en una carpeta con permisos restrictivos (e.g., `chmod 600`). - Nunca expongas la clave privada en el cliente o en repositorios públicos. 2. **Certificados:** - Si el receptor requiere el uso de un certificado (como `Certificate.crt`), asegúrate de incluirlo en la autenticación inicial. 3. **Seguridad en Hosting Compartido:** - Aunque esto es funcional en un hosting compartido, considera que estos entornos no siempre son seguros para manejar claves privadas sensibles. Evalúa mover tu aplicación a un VPS o servidor dedicado. 4. **Prueba con Datos Reales:** - Realiza pruebas con los datos reales que vas a enviar al receptor (como el API del servicio donde autenticarás y enviarás el JSON firmado). --- ### **¿Qué Sigo?** Si necesitas ayuda para implementar la **autenticación previa** o el **envío del JSON firmado** a través de una API (por ejemplo, con `cURL` en PHP), házmelo saber y lo adaptamos a tu caso específico. ¡Estoy para ayudarte! 😊