Eu tenho dois pedaços de dados base64 em uma variável bash. As quebras de linha usuais nos dados base64 foram substituídas por espaços e a variável é basicamente uma sequência de uma linha muito longa.
Posso decodificar os dois blocos de dados base64 contidos na variável, mas experimentei algumas nuances ao tentar fazer isso. Gostaria de entender se estou abordando isso corretamente ou se há uma maneira melhor de decodificar dados base64 que não contêm quebras de linha. Aqui está o que eu tenho:
O primeiro pedaço tem 350 caracteres e posso decodificá-lo com sucesso da seguinte forma:
echo ${DATA::350} | openssl base64 -d | wc -c
256
O segundo pedaço tem 5745 caracteres, mas o comando acima não produz os resultados esperados. ou seja:
$ echo {DATA:350} | openssl base64 -d | wc -c
432
No entanto, funciona se eu colocar a linha de volta:
$ echo ${DATA:350} | tr ' ' "\n" | openssl base64 -d | wc -c
4240
Espero que exista algum problema no comprimento da linha que o primeiro pedaço seja pequeno o suficiente para evitar, e isso pareceria um recurso do decodificador base64 sendo usado (os dois usuais base64
e openssl base64
se comportam de maneira diferente).
O base64
decodificador (em vez de openssl base64
) para no primeiro caractere inválido (espaço em branco) e, portanto, apenas decodifica a primeira "linha" (48 bytes de dados de saída), enquanto o OpenSSL gera 432 caracteres (9 "linhas"). O base64
comando tem uma opção para ignorar o lixo , portanto, isso funciona:
$ echo ${DATA:350} | base64 -d -i | wc -c
4240
O decodificador OpenSSL não parece ter essa opção.
Além disso, a remoção do espaço em branco funciona inteiramente para, base64
mas não para openssl base64
:
$ echo ${DATA:350} | tr -d ' ' | openssl base64 -d | wc -c
400
$ echo ${DATA:350} | tr -d ' ' | base64 -d | wc -c
4240
Então, no final, substituí as novas linhas e usei o decodificador OpenSSL porque precisava processar os dados decodificados de qualquer maneira:
$ openssl enc -d -a -in <(echo ${DATA:350} | /usr/bin/tr ' ' "\n") -aes-256-cbc -pass file:<(echo $skey) | ...
Mas eu gostaria de entender O OpenSSL pode decodificar dados base64 que não contêm quebras de linha?
tr
, usando${var//old[/new}
- mas não ao mesmo tempo como substring.Respostas:
Se você não precisar de espaços,
openssl
lidará com isso com a-A
opção:Assim:
Podemos ver que os dados base64 estão todos em uma linha e podem ser decodificados.
man enc
explica a-A
opçãoSe você precisar manter os espaços, será necessário removê-los (convertendo para
'\n'
ou excluindo e usando-A
).fonte
-A
opção foi uma das primeiras coisas que tentei, mas o fiz antes de tentar remover os espaços e depois "seguir em frente" quando não funcionou! A página de manual não menciona nada sobre os espaços serem um problema. Enfim, eu apenas tentei novamente com os espaços removidos e funciona. Ainda é desagradável, mas pelo menos é apenas umtr -d ' '
. É uma pena que não possa processá-lo e ignore o espaço em branco (comobase64
pode).openssl base64 -A
está mais perto de ser uma interpretação estrita, o que você esperaria de uma ferramenta de criptografia de segurança. Eu acho que o coreutilsbase64
é mais brando.-A
é basicamente "nós temos osEVP_{En,De}codeBlock
fatores, podemos deixar que as pessoas os usem".