Base64 seguridad: qué protege y qué no protege la codificación

Separe la codificación reversible del cifrado, las firmas y la validación, y maneje documentos decodificados sin ejecutarlos.

Base64 no proporciona secreto. Cualquiera que reciba el valor codificado puede recuperar sus bytes sin contraseña ni clave. Ocultar las credenciales en una cadena larga cambia su apariencia, no quién puede leerlas. Aplicar las mismas reglas de manejo a los secretos codificados que a los originales.

Codificación, cifrado y firmas responden a diferentes preguntas

La codificación pregunta cómo pueden viajar los bytes a través de un sistema orientado a texto. El cifrado protege la confidencialidad bajo una clave criptográfica. Una etiqueta de autenticación o una firma digital pueden establecer que los datos fueron producidos por una parte autorizada y no han sido alterados, siempre que el proceso de verificación y las claves sean correctos. Una suma de comprobación simple ayuda principalmente a detectar daños accidentales. Ninguna de estas garantías se deriva únicamente de Base64.

Un JWT decodificado es un ejemplo útil. Su encabezado y carga útil son estructuras legibles, pero leerlos no verifica la firma, el emisor, la audiencia o la política de vencimiento. Trate un reclamo no verificado como información que no es confiable. No permita que el JSON formateado de un espectador se convierta en una decisión de autorización.

Mantenga inerte el contenido decodificado

Una carga útil puede decodificarse en HTML, JavaScript, un SVG que contenga contenido activo o un documento con formato incorrecto. Mostrar texto con textContent, no innerHTML. No ejecute código decodificado ni inserte un SVG arbitrario en su página. El remitente proporciona un tipo de datos declarado URI MIME y puede ser falso. Las firmas de archivos ayudan a identificar un formato probable, pero un encabezado coincidente no establece que un archivo esté completo o sea seguro.

// decodedText comes from an untrusted payload.
const output = document.createElement('pre');
output.textContent = decodedText;
document.body.append(output); // displays markup as text

Establecer límites antes de asignar memoria

El texto codificado expande los datos y un navegador puede contener la cadena de entrada, los bytes decodificados y obtener una vista previa al mismo tiempo. Haga cumplir los límites antes de decodificar, restrinja los tipos de documentos aceptados y permita a los usuarios cancelar operaciones largas. La entrada con formato incorrecto debería producir un estado de error separado en lugar de una salida que pueda copiarse como si fueran datos exitosos.

Para trabajos delicados, inspeccione el comportamiento de la red y la política de retención de la herramienta. El procesamiento del navegador y el procesamiento del servidor API tienen límites diferentes. Evite colocar tokens en las URL de las páginas, donde pueden ingresar al historial del navegador, capturas de pantalla o registros de acceso. Al realizar pruebas, utilice datos sintéticos con la misma estructura. RFC 4648 analiza las ambigüedades de codificación; La seguridad de un protocolo más grande todavía depende de su diseño completo.