Halloween DealsAmazon USHalloween week deals: useful picks before month-endAmazon US: current deals, useful picks and tech finds.Check DealsSlow PC?RecommendedPC slow today? Run a repair scan before it gets worseResolve common Windows issues and optimize system performance.Scan NowHalloween DealsAmazon USOctober picks are moving - compare before checkoutAmazon US: current deals, useful picks and tech finds.See Picks×
Skip to content
World desk8 min

Cifrado al vuelo con encrypt() y decrypt() y auto-JSON: qué hace realmente la función

Algunas bibliotecas cifran objetos con encrypt() serializándolos a JSON antes. Qué ocurre internamente, qué alinear entre PHP y JavaScript y qué revisar en seguridad.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Algunas bibliotecas ofrecen encrypt($valor) y decrypt($ciphertext) que aceptan arrays u objetos y devuelven el mismo valor al descifrar. La comodidad no viene del cifrado: la biblioteca convierte el valor a JSON antes de cifrarlo y vuelve a interpretar el JSON al descifrar. Ningún algoritmo cifra objetos; cifra bytes. Por eso la función puede parecer mágica, pero su comportamiento depende de qué serialización usa, qué algoritmo aplica y qué comprueba antes de devolverte datos.

Qué hace realmente la llamada automática

Cuando llamas a una función de este tipo con un valor estructurado, el trabajo ocurre en una secuencia fija:

As an Amazon Associate I earn from qualifying purchases.

  1. Recibe el valor (array, objeto, número, booleano, texto o null).
  2. Lo serializa a JSON: json_encode() en PHP o JSON.stringify() en JavaScript.
  3. Convierte el texto JSON en bytes, normalmente en UTF-8.
  4. Cifra esos bytes con un algoritmo, una clave, un IV o nonce y, según la biblioteca, una etiqueta de autenticación.
  5. Empaqueta el resultado (IV, salt, ciphertext, a veces un identificador de formato) en una cadena.

El descifrado recorre el camino inverso, y ahí está el punto frágil: si el texto descifrado no es JSON válido, la función debe fallar, no devolver un fragmento como si fuera el valor original.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
valor → JSON → bytes → cifrado → contenedor
contenedor → descifrado → bytes → JSON → valor

Dónde aparece esta comodidad

El patrón existe en bibliotecas concretas, pero cada una documenta cosas distintas. Conviene leer la ficha de la versión que vayas a usar antes de asumir un comportamiento.

#1 Best Overall
Sale
Thetis Nano-A FIDO2 Security Key Hardware Passkey Device with USB Type A, TOTP/HOTP, FIDO2.0 Two Factor Authentication 2FA MFA, Works with Windows/mac/iOS/Android/Linux/Gmail/Facebook/GitHub/Coinbase
  • Ultra-Compact FIDO2 Security Key - Plug-and-stay or carry on a keychain. This USB-A hardware security key offers portable, always-on protection for desktop and mobile use. (Item Size: 0.75 X 0.74 IN x 0.25 IN)
  • USB-A Hardware Key for All Devices - Works with USB-A ports on PC, Mac, Android, and other laptop/notebook device. Enables secure, cross-platform login with FIDO2.0 passkey support.
  • FIDO Certified Security Key - Meets FIDO and FIDO2 standards. Works with Google, Microsoft, GitHub, Dropbox, and more. Please check service compatibility before purchase.
  • Passwordless Login with Passkey - Supports passkey login via WebAuthn and CTAP2. Enjoy password-free sign-ins where supported. Not all websites or services currently support passkeys.
  • Advanced Multi-Factor Authentication - Offers 200 FIDO2 passkey slots and 50 OATH-TOTP slots. Strong, flexible 2FA/MFA support across various apps and authentication platforms.

brainfoolong/js-aes-php

La ficha en Packagist indica que acepta valores de JavaScript que pasan por JSON.stringify y valores de PHP que pasan por json_encode, y que los datos pueden cifrarse en un lenguaje y descifrarse en el otro. Declara AES-256-CBC, un salt aleatorio y un IV aleatorio por operación, con salida hexadecimal. La versión visible en la ficha consultada en 2026 es la 1.0.5.

Dos advertencias de la propia documentación merecen atención. La salida no es un reemplazo directo de la biblioteca antecesora, así que no puedes migrar datos cifrados existentes sin una conversión. Y la ficha revisada no documenta una etiqueta de autenticación: no la describas como cifrado autenticado hasta que inspecciones el código de la versión que usas.

InitPHP Encryption

El README de InitPHP Encryption documenta que encrypt() acepta un valor de tipo mixed y que usa JSON como serializador por defecto. El ciphertext incluye una marca del serializador usado, de modo que el descifrado puede restaurar el tipo original.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Este proyecto documenta además dos decisiones relevantes para producción. La autenticación es el comportamiento por defecto: HMAC con OpenSSL o AEAD con Sodium. Y el formato tiene un encabezado versionado; tras un cambio mayor, los ciphertexts antiguos se rechazan en lugar de descifrarse de forma silenciosa.

Qué no hacen las primitivas de PHP y JavaScript

Las funciones nativas trabajan con datos binarios o texto plano y exigen que aportes el algoritmo, la clave y los parámetros. No serializan objetos. La conversión a JSON, cuando existe, la pone tu código o la biblioteca que envuelve la primitiva.

Aspecto openssl_encrypt() en PHP SubtleCrypto.encrypt() en Web Crypto Wrapper tipo encrypt($valor)
Entrada Cadena de datos BufferSource (datos binarios) Valor estructurado
Parámetros obligatorios Método de cifrado, clave, opciones e IV Objeto de algoritmo, CryptoKey y datos Según la biblioteca; el IV suele gestionarlo internamente
Serialización JSON No incluida No incluida Incluida; el usuario no la invoca de forma explícita
Autenticación Depende del modo: los modos AEAD usan una etiqueta; CBC no la incluye Depende del algoritmo: AES-GCM incluye etiqueta; AES-CBC no Depende de la biblioteca (ver la sección de seguridad)

La documentación de referencia está en PHP: openssl_encrypt y en las páginas de SubtleCrypto.encrypt() y SubtleCrypto.decrypt(). Si usas esas primitivas, escribes tú la serialización, el empaquetado y la validación.

Rank #2
GoTrust Idem Key C USB Security Key NFC FIDO2 L2 Certified
  • Protect accounts with USB-C & NFC 2FA security key. Hardware-based authentication blocks phishing, credential theft & unauthorized access across cloud, enterprise & personal platforms.
  • FIDO2 Level 2 certified Security Key. Works with Apple ID, Microsoft Azure/Entra ID, AWS, Google, Facebook, Salesforce, DUO & more. Compatible with Chrome, Safari & Edge on all major OS.
  • Plug & play USB-C Security Key with NFC tap login. No software, drivers or batteries required. Works with Windows PC, MacBook, iPhone, Android & Chromebook for fast, secure authentication.
  • Built with FIPS 140-2 Level 3 secure element for advanced encryption. Trusted by IT teams, healthcare, education & government for secure authentication & identity protection.
  • IP68 waterproof, dustproof & crush-resistant design. Supports FIDO2, U2F, OTP, PIV, Mini Driver & smart card login. Durable USB security key for long-term enterprise & daily use.

Qué debes alinear entre PHP y JavaScript

Para que un extremo descifre lo que cifró el otro, ambos deben coincidir en todos estos puntos:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  • Algoritmo y modo (por ejemplo AES-256-CBC frente a AES-GCM no son intercambiables).
  • Clave y la forma exacta de derivarla, incluidos el salt, la función de derivación y sus iteraciones si existen.
  • IV o nonce y cómo se transmite dentro del contenedor.
  • Padding o etiqueta de autenticación, según el modo.
  • Codificación de entrada y salida: UTF-8, base64 o hexadecimal.
  • Forma exacta del contenedor y, si existe, su número de versión.
  • Reglas JSON aceptadas por ambos lados.
Diferencia Síntoma típico Cómo evitarla
Hex en un lado, base64 en el otro Error de decodificación o longitud de clave incorrecta Documenta la codificación del contenedor y valídala en la entrada
Modo CBC en un lado, GCM en el otro Fallo de descifrado aunque la clave sea correcta Fija algoritmo y modo en configuración compartida
Iteraciones de derivación distintas La clave derivada no coincide Guarda iteraciones y salt dentro del contenedor o en la versión del formato
JSON distinto (ver trampas abajo) Descifra bien pero el valor no es igual al original Compara el valor reconstruido, no solo la cadena cifrada

Trampas de JSON entre PHP y JavaScript

  • Un array vacío en PHP se serializa como [], mientras que un objeto vacío en JavaScript es {}. Si tu contrato distingue ambos, define cuál usas.
  • Un array PHP con claves no consecutivas se convierte en objeto JSON, lo que cambia el tipo al descifrar en JavaScript.
  • json_encode() escapa la barra « / » y los caracteres Unicode por defecto. Ambos formatos son válidos, pero la cadena cifrada cambia; usa las opciones que fijes en el contrato, por ejemplo JSON_UNESCAPED_UNICODE y JSON_UNESCAPED_SLASHES, de forma consistente en ambos lados.
  • JavaScript representa los números como coma flotante de doble precisión; enteros mayores que 2^53 pierden precisión. Envía identificadores grandes como texto.
  • JSON.stringify() omite las propiedades con valor undefined y las funciones, y convierte las fechas en texto.

Prueba cruzada mínima antes de integrar

Antes de poner este flujo en producción, ejecuta una prueba de ida y vuelta con el mismo paquete y versión en ambos lados:

  1. Fija la biblioteca y su versión exacta en PHP y en JavaScript.
  2. Prepara un conjunto de valores: escalar, lista, objeto anidado, texto con acentos y emoji, null, booleano, cadena vacía, array vacío y objeto vacío.
  3. Cifra cada valor en PHP, descífralo en JavaScript y compara el resultado con el original, no solo que no haya error.
  4. Invierte la dirección: cifra en JavaScript y descifra en PHP.
  5. Altera un carácter del ciphertext y confirma que el descifrado falla. Si devuelve datos, el esquema no detecta modificaciones.
  6. Envía una entrada corrupta o un JSON inválido en el descifrado y confirma que la operación devuelve un error controlado.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Seguridad antes de usar el cifrado automático

Autenticidad e integridad

Descifrar correctamente no prueba que el contenido no haya sido modificado. Un esquema de cifrado sin autenticación puede dejar pasar cambios controlados por un atacante. Un ejemplo comunitario antiguo de Stack Overflow que combina PHP y CryptoJS muestra el patrón JSON, pero su propia discusión advierte de una vulnerabilidad de ataque de texto cifrado elegido en el código publicado. No lo copies como implementación recomendada.

Si la biblioteca documenta HMAC o AEAD, verifica que la etiqueta se comprueba antes de devolver el valor. Si no lo documenta, añade la autenticación fuera de la biblioteca o elige otra.

Claves

Derivar una clave del tamaño correcto a partir de una cadena no añade entropía. InitPHP recomienda una clave aleatoria de 256 bits en producción y guardarla fuera del repositorio. Define también un plan de rotación y cómo convivirán las claves antiguas y nuevas durante la transición.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Serialización y tipos

JSON evita el riesgo de instanciar clases de PHP durante la deserialización, que sí puede asociarse con unserialize(). Pero JSON no transporta bytes binarios sin procesar. Si tus datos incluyen binario, codifícalos explícitamente en base64 o hexadecimal dentro del JSON.

Rank #3
GoTrust Idem Key A USB Security Key NFC FIDO2 L2 Certified
  • Protect accounts with USB-A & NFC 2FA security key. Hardware-based authentication blocks phishing, credential theft & unauthorized access across cloud, enterprise & personal platforms.
  • FIDO2 Level 2 certified Security Key. TAA compliant and supports Apple ID, Microsoft Azure/Entra ID, AWS, Google, Facebook, Salesforce, DUO & more. Works with Chrome, Safari & Edge across major OS.
  • Plug & play USB-A Security Key with NFC tap login. No software, drivers or batteries required. Works with Windows PC, MacBook, iPhone, Android & Chromebook for fast, secure authentication.
  • Built with FIPS 140-2 Level 3 secure element for advanced encryption. Trusted by IT teams, healthcare, education & government for secure authentication and identity protection.
  • IP68 waterproof, dustproof & crush-resistant design. Supports FIDO2, U2F, OTP, PIV, Mini Driver & smart card login. Durable USB security key for long-term enterprise and daily use.

Errores y versiones del formato

Un descifrado que falla debe fallar cerrado: no devuelvas texto parcial y no caigas en un valor por defecto. Incluye un número de versión en el contenedor desde el primer día, para poder migrar sin ambigüedad cuando cambie el formato.

Modelo de amenaza en el navegador

Si JavaScript necesita descifrar, la clave debe estar disponible en el cliente, y quien controle ese cliente puede leerla. Antes de elegir cifrado del lado del navegador, define quién debe poder leer el dato y dónde debe residir la clave. Esta es una consideración de arquitectura general, no un resultado específico de las bibliotecas citadas.

Cómo elegir entre enfoques

Las dos fichas revisadas no son intercambiables por defecto. Esta tabla compara lo que cada una documenta; donde la ficha no dice nada, se indica.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Criterio brainfoolong/js-aes-php (Packagist, v1.0.5) InitPHP Encryption (README)
Lenguajes PHP y JavaScript, con serialización equivalente PHP documentado; JavaScript: not stated
Algoritmo AES-256-CBC not stated en el README revisado
Autenticación No documentada en la ficha revisada HMAC con OpenSSL o AEAD con Sodium por defecto
Serialización JSON según json_encode y JSON.stringify JSON por defecto; marca del serializador en el ciphertext
Salida y formato Hexadecimal; versionado: not stated Encabezado de formato versionado; rechaza ciphertexts antiguos tras cambio mayor
Claves y derivación Salt e IV aleatorios; detalle de derivación: not stated Recomienda clave aleatoria de 256 bits; advierte que derivar no añade entropía
Migración Advierte que no es reemplazo directo de su antecesora not stated

Si necesitas interoperabilidad entre PHP y JavaScript, la ficha de js-aes-php es la que documenta ese caso de uso de forma explícita, pero debes verificar la autenticación en su código antes de confiar en ella. Si necesitas cifrado autenticado y formato versionado en PHP, InitPHP documenta esas propiedades, aunque no describe el lado JavaScript. En ambos casos, la prueba cruzada de la sección anterior decide si el sistema funciona con tus datos reales.

The Bottom Line

Usa un cifrado con «auto-JSON» solo cuando la biblioteca documente el serializador, la autenticación, la codificación y la versión del formato, y cuando la prueba de ida y vuelta entre PHP y JavaScript pase con tus propios valores. Si alguno de esos puntos no está escrito, serializa el JSON tú mismo y elige un esquema con autenticación explícita.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Leave a Reply

Your email address will not be published. Required fields are marked *

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

More from the Wire

  1. World desk4 min
    How to Spot an AI Voice Scam Before Sending MoneyDon’t rely on how a caller sounds. Pause, call back through a known number, and verify the emergency with another trusted person before sending money.
  2. Mountain View desk4 min
    Google’s SynthID Detector: How to Check AI-Generated Images, Video and AudioGoogle’s SynthID Detector looks for an embedded watermark in supported images, video and audio. Here is what its results do—and do not—show.
  3. Redmond desk20 min
    How to create a link to File or Folder in Windows 11Windows 11 gives you several ways to point to a file or folder without moving or duplicating it. You can create a desktop shortcut,…
Recommended PC Tool
Recommended PC Tool
PC Slower Than It Used to Be?Free scan - under a minute
Outdated Drivers Are Slowing You DownFree scan - exact matches

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.