Декодирование в случайном порядке в кодировке Base64 на MinGW не работает - PullRequest
1 голос
/ 03 ноября 2019

Я пытаюсь заставить скрипт bash работать на MinGW, и кажется, что оболочка не может декодировать что-то вроде следующего.

t=$(openssl rand -base64 64)
echo "$t" | base64 --decode

В результате,

 Ԋ7▒%
     ▒7▒SUfX▒L:o<x▒▒䈏ţ94V▒▒▒▒uW;▒▒pxu▒base64: invalid input

Интересно, что если я выведу символ base64 и выполню команду как таковую, она будет работать.

echo "+e5dcWsijZ83uR2cuKxIDJTTiwTvqB7J0EJ63paJdzGomQxw9BhfPvFTkdKP9I1o
g29pZKjUfDO8/SUNt+idWQ==" | base64 --decode

Кто-нибудь знает, что я делаю не так?

Спасибо

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019

Я думаю, что здесь произошло то, что строка base64 содержит некоторые встроенные пробелы, и это вызывает фактический «недопустимый ввод» w (и то, что вы наблюдаете как мусор).

Команда openssl rand -base64 64 вводитнекоторые символы новой строки (не пробелы), например,

openssl rand -base64 64 > b64.txt

... затем просматривая файл b64.txt в редакторе, я вижу две отдельные строки

tPKqKPbH5LkGu13KR6zDdJOBpUGD4pAqS6wKGS32EOyJaK0AmTG4da3fDuOI4T+k
abInqlQcH5k7k9ZVEzv8FA==

... иэто означает, что между символами «k» и «a» есть символ новой строки

Таким образом, строка base64 имеет этот встроенный символ новой строки. base64 -d может обрабатывать символы новой строки (как продемонстрировал ваш успешный пример), но не может обрабатывать символ пробела.

Символы новой строки могут переводиться в пробелы с помощью некоторых действий оболочки. Скорее всего, это происходит с помощью echo $t Т.е., если t имеет внутри себя новые строки, тогда эхо просто заменит один пробел. Фактически, его поведение может зависеть от параметров оболочки и типа применяемых строковых кавычек.

Чтобы исправить команду, мы можем удалить символ новой строки перед передачей в команду base64 -d.

Один из способов сделать это - использовать команду tr, например, в Linux работает следующее:

t=$(openssl rand -base64 64 | tr -d '\n')
echo $t | base64 -d

... или, альтернативно, удалить пробелы, снова используя tr

t=$(openssl rand -base64 64)
echo $t | tr -d ' ' | base64 -d
0 голосов
/ 03 ноября 2019

Я решил описанный выше случай, передав флаг --ignore-garbage декодированию base64. Он игнорирует не алфавитные символы.

echo "$t" | base64 --decode --ignore-garbage

Однако я все же хотел бы знать, как я создал «мусор»;)?

...