¿Por qué mi base64 decodificado parece basura?
Ha decodificado algo y ha obtenido una ristra de caracteres sin sentido, signos de interrogación o símbolos de reemplazo. Hay dos razones bastante distintas para eso, y piden respuestas opuestas, así que conviene saber cuál está mirando.
La primera es que su entrada nunca fue base64. El alfabeto de base64 son letras, dígitos, más y barra, lo que significa que muchísimo texto corriente pasa por base64 válido solo por su forma. Un resumen hexadecimal, un UUID sin guiones, un hash de commit de git y palabras inglesas llanas como "test" o "Password" superan cualquier comprobación de caracteres. Decodificarlas es una operación legítima que produce bytes que nunca fueron texto, así que el resultado es ruido. El decodificador no falló: respondió a una pregunta que usted no quería hacer.
La segunda es que la entrada sí era base64 y la carga sencillamente no es texto. Base64 existe para llevar bytes arbitrarios por canales que solo aceptan caracteres, y esos bytes son a menudo una imagen, un archivo comprimido, un certificado, un mensaje protobuf o un bloque cifrado. La decodificación funcionó perfectamente. Lo que salió nunca estuvo pensado para leerse como letras.
Suele distinguirse por los primeros bytes del resultado. Un PNG empieza con las letras PNG tras un byte no imprimible; un flujo gzip empieza con dos bytes fijos; un PDF lleva una marca visible al principio; un certificado en forma DER empieza con un byte de estructura y no con algo legible. Si la salida empieza con una firma reconocible, tiene datos reales en un formato y no una decodificación fallida.
La otra comprobación es la reversibilidad. Vuelva a codificar el resultado y compárelo con lo que tenía al principio. El base64 genuino da la vuelta exacto. Un valor que solo tenía forma de base64 normalmente no, porque su longitud o su relleno nunca salieron de un codificador.
Esto importa sobre todo en herramientas que decodifican repetidamente. Una que siga quitando capas mientras la entrada aún parezca decodificable acabará destruyendo un valor perfectamente bueno al decodificarlo una vez de más, y declarará un número de capas que incluye una que nunca existió. Detenerse en el punto correcto, y decir por qué, es la parte realmente difícil.