Tecnología · GUÍA PRÁCTICA
¿Base64 con validate=True acepta otras formas? Compruebe bits de relleno y versión de Python
Decodificación estricta y una única representación canónica son comprobaciones distintas. Diecisiete controles locales separan bits de relleno, opciones de versión, límites y significado de los bytes.

En nuestro CPython3.12.14, base64.b64decode(value, validate=True) aceptó tanto Zg== como Zh== para el byte f, y tanto Zm8= como Zm9= para fo. El éxito de una decodificación estricta no demostró que el texto tuviera la forma canónica.
Empiece por el protocolo que realmente necesita. Esta guía prueba una política limitada: entrada bytes no vacía, alfabeto Base64 estándar, relleno obligatorio cuando corresponde, longitudes acotadas y coincidencia exacta al recodificar. No valida JWT, firmas ni mensajes MIME.
1. Separe caracteres de relleno y bits sin utilizar
Zg== y Zh== tienen el mismo número de signos igual; difieren en bits no utilizados del último carácter del alfabeto. La decodificación estricta aceptó ambos, pero al recodificar los bytes apareció únicamente Zg==, por lo que la segunda forma no superó la igualdad. Lo mismo ocurrió con Zm8= y Zm9=.
RFC4648 exige que los codificadores conformes pongan a cero los bits de relleno no usados. Permite a los decodificadores rechazar bits distintos de cero, y el protocolo que lo cite puede exigirlo. Por eso la aceptación del decodificador no decide si una entrada cumple la regla de una sola forma de la aplicación.
2. Compruebe la versión antes de usar otro argumento
La documentación de Python3.15 añade canonical=True para rechazar bits de relleno no nulos. Mantenga explícita la validación del alfabeto con validate=True y conserve las reglas de relleno y tamaño. Leímos esa documentación, pero no ejecutamos Python3.15.
Pasar canonical=True al CPython3.12.14 real produjo TypeError por un argumento inesperado. En ese entorno, decodifique con validate=True y exija base64.b64encode(decoded)==encoded para esta política estándar con relleno. La comparación comprueba la representación, no un MAC o una firma.
3. Aplique toda la política con límites
Nuestro auxiliar exige que el tipo sea exactamente bytes y rechaza entradas codificadas de más de 4096 bytes. Decodifica estrictamente, rechaza salidas de más de 3072 bytes, aplica la regla de contenido no vacío y compara la recodificación estándar con la entrada. Solo devuelve bytes si pasa todo.
Los 17 controles incluyeron codificaciones válidas de f, fo y foo; dos variantes de bits; relleno redundante o excesivo; salto de línea; relleno obligatorio ausente; un carácter URL-safe; datos tras el relleno; y vacío. Otros controles verificaron los límites antes y después de decodificar, el argumento no admitido y un fallo UTF-8 independiente.
4. Separe el formato del significado del contenido
Los tres bytes completos foo se codifican canónicamente como Zm9v, sin signos igual. Exigir el relleno necesario no significa añadir = a toda entrada: nuestro decodificador estricto rechazó Zm9v=. La cadena Base64 vacía se decodificó, pero la aplicación rechazó deliberadamente ese contenido.
La entrada canónica /w== produjo el byte 0xff y pasó nuestra política; su conversión a UTF-8 falló. Por tanto, el formato válido no demuestra texto o archivo válido ni autenticidad. Conserve la entrada original fallida para diagnosticar y no elimine caracteres ni añada relleno silenciosamente cuando el contrato exige una forma exacta.
