Здесь есть три разных результата, потому что вы передаете три разные строки в base64
.
По вашему вопросу на base64
, ожидая, что вход будет двоичным, @chepner прямо здесь:
Все данные являются двоичными; text - это просто поток байтов, представляющих кодировку (ASCII, UTF-8 и т. д. c) текста.
Промежуточные шаги
Давайте сохраним общую команду в переменной для ясности.
$ msg='The quick brown fox jumps over the lazy dog'
$ sha_val="$(printf "$msg" | openssl sha1 | awk '{ print $2 }')"
$ printf "$sha_val"
2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
Несколько замечаний:
Сравнение байтов
Мы можем использовать xxd для сравнения байтов для каждый, используя -c 1000
, чтобы использовать 1000-символьные строки (т.е. не добавлять новые строки для <1000-символьных строк). Это полезно для строк, таких как вывод в method2, где есть управляющие символы, которые не могут быть напечатаны. </p>
method 1
Это шестнадцатеричное представление значения sha. Например, первый 2
в выводе шага в этом результате равен 32
, поскольку шестнадцатеричное число 32 <=> de c 50 <=> ASCII / UTF-8 "2". Если это сбивает с толку, взгляните на ASCII таблицу .
$ printf "$sha_val" | xxd -p -c 1000
32666434653163363761326432386663656438343965653162623736653733393162393365623132
метод 2
Этот вывод ТОЧНЫЙ ЖЕ, как $ sha_val, учитывая, что мы преобразование из шестнадцатеричного в бинарный ASCII и затем обратно с xxd. Обратите внимание, что преобразование значения sha из шестнадцатеричного в двоичное не обязательно для base64.
$ printf "$sha_val" | xxd -r -p | xxd -p -c 1000
2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
метод 3
xxd -p
переопределяет параметр -b
, поэтому xxd -b -p
<=> xxd -p
.
$ printf "$sha_val$" | xxd -p -c 1000 | xxd -p -c 1000
33323636363433343635333136333336333736313332363433323338363636333635363433383334333936353635333136323632333733363635333733333339333136323339333336353632333133323061
Как видите, base64 генерирует три разные строки, поскольку получает три разные строки.