Как закодировать сумму md5 в base64 в BASH
Мне нужно закодировать хеш-память md5 на базе 64. Проблема в том, что если выдавать команду md5sum команде base64, она рассматривается как текст, а не как шестнадцатеричные данные. Как управлять им? Команда Base64 не имеет возможности установить его как шестнадцатеричное число.
Спасибо за любую помощь.
Ответы
Ответ 1
Используйте openssl dgst -md5 -binary
вместо md5sum
. Если вы хотите, вы можете использовать его и для base64-кодирования, чтобы использовать только одну программу для всех целей.
echo -n foo | openssl dgst -md5 -binary | openssl enc -base64
(openssl md5
вместо openssl dgst -md5
тоже работает, но я думаю, что лучше быть явным)
Ответ 2
Вы также можете использовать xxd (поставляется с vim) для декодирования шестнадцатеричного кода, прежде чем передавать его в base64:
(echo 0:; echo -n foo | md5sum) | xxd -rp -l 16 | base64
Ответ 3
unhex ()
{
for ((b=0; b<${#1}; b+=2))
do
printf "\\x${1:$b:2}";
done
}
md5sum2bytes ()
{
while read -r md5sum file; do
unhex $md5sum;
done
}
md5sum inputfile | md5sum2bytes | base64
Ответ 4
В busybox вы не сможете использовать синтаксис цикла. Ниже unhex() реализуется с помощью цикла while:
unhex ()
{
b=0;
while [ $b -lt ${#1} ];
do
printf "\\x${1:$b:2}";
b=$((b += 2));
done
}
md5sum2bytes ()
{
while read -r md5sum file; do
unhex $md5sum;
done
}
md5sum inputfile | md5sum2bytes | base64