Подтвердить что ты не робот

Как закодировать сумму md5 в base64 в BASH

Мне нужно закодировать хеш-память md5 на базе 64. Проблема в том, что если выдавать команду md5sum команде base64, она рассматривается как текст, а не как шестнадцатеричные данные. Как управлять им? Команда Base64 не имеет возможности установить его как шестнадцатеричное число.

Спасибо за любую помощь.

4b9b3361

Ответ 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