Tengo dos fragmentos de datos base64 en una variable bash. Los saltos de línea habituales dentro de los datos de base64 han sido reemplazados por espacios y la variable es básicamente una cadena muy larga de una línea.
Puedo decodificar los dos fragmentos de datos de base64 contenidos en la variable, pero experimenté algunos matices al intentar hacerlo. Me gustaría entender si me estoy acercando a esto correctamente o si hay una mejor manera de decodificar datos base64 que no contengan saltos de línea. Esto es lo que tengo:
El primer fragmento tiene 350 caracteres y puedo decodificarlo con éxito así:
echo ${DATA::350} | openssl base64 -d | wc -c
256
El segundo fragmento tiene 5745 caracteres, pero el comando anterior no produce los resultados esperados. es decir:
$ echo {DATA:350} | openssl base64 -d | wc -c
432
Sin embargo, funciona si vuelvo a poner saltos de línea:
$ echo ${DATA:350} | tr ' ' "\n" | openssl base64 -d | wc -c
4240
Espero que haya algún problema de longitud de línea que el primer fragmento es lo suficientemente pequeño como para evitarlo, y parece ser una característica del decodificador base64 que se está utilizando (los dos habituales base64
y se openssl base64
comportan de manera diferente).
El base64
decodificador (en lugar de openssl base64
) se detiene en el primer carácter no válido (el espacio en blanco) y, por lo tanto, solo decodifica la primera "línea" (48 bytes de datos de salida) mientras que OpenSSL genera 432 caracteres (9 "líneas"). El base64
comando tiene una opción para ignorar la basura , por lo que esto funciona:
$ echo ${DATA:350} | base64 -d -i | wc -c
4240
El decodificador OpenSSL no parece tener esa opción.
Además, eliminar el espacio en blanco funciona por completo base64
pero no para openssl base64
:
$ echo ${DATA:350} | tr -d ' ' | openssl base64 -d | wc -c
400
$ echo ${DATA:350} | tr -d ' ' | base64 -d | wc -c
4240
Entonces, al final, reemplacé las nuevas líneas y usé el decodificador OpenSSL porque de todos modos necesitaba procesar aún más los datos decodificados:
$ openssl enc -d -a -in <(echo ${DATA:350} | /usr/bin/tr ' ' "\n") -aes-256-cbc -pass file:<(echo $skey) | ...
Pero me gustaría entender ¿Puede OpenSSL decodificar datos base64 que no contienen saltos de línea?
tr
usar${var//old[/new}
, pero no al mismo tiempo que la subcadena.Respuestas:
Si no necesita espacios,
openssl
lo manejará con la-A
opción:Entonces:
Podemos ver que los datos de base64 están todos en una línea y pueden decodificarse.
man enc
explica la-A
opciónSi necesita conservar los espacios, deberá eliminarlos (ya sea convirtiéndolos
'\n'
o eliminándolos y utilizándolos-A
).fuente
-A
opción fue una de las primeras cosas que probé, pero lo hice antes de intentar eliminar los espacios y luego "seguir adelante" cuando no funcionó! La página del manual no menciona nada acerca de que los espacios sean un problema. De todos modos, lo he intentado nuevamente con los espacios eliminados y funciona. Todavía es desagradable, pero al menos es solo untr -d ' '
. Es una pena que no pueda procesarlo e ignorar el espacio en blanco (comobase64
puede).openssl base64 -A
lo tanto, está más cerca de ser una interpretación estricta, que esperaría de una herramienta de cifrado de seguridad. Supongo que el coreutilsbase64
es más indulgente.-A
es básicamente "tenemos losEVP_{En,De}codeBlock
factores, también podríamos dejar que la gente los use".