2011-01-03 8 views
22

Potrzebuję zakodować hash md5 na podstawie 64. Problem polega na tym, że jeśli dajesz wynik polecenia md5sum komendę base64, jest on traktowany jako tekst, a nie jako dane szesnastkowe. Jak nim zarządzać? Polecenie Base64 nie ma opcji do ustawienia wejścia jako liczby szesnastkowej.Jak kodować sumę md5 do base64 w BASH

Dzięki za pomoc.

Odpowiedz

42

Użyj openssl dgst -md5 -binary zamiast md5sum. Jeśli chcesz, możesz użyć go również do kodowania base64, aby używać tylko jednego programu dla wszystkich zastosowań.

echo -n foo | openssl dgst -md5 -binary | openssl enc -base64

(openssl md5 zamiast openssl dgst -md5 działa zbyt, ale myślę, że lepiej jest być jawne)

+0

Dzięki dużo. To działa dobrze. –

0
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 
0

W Busybox może nie być w stanie wykorzystać do składni pętli. Poniżej unhex() jest realizowane z pętli while Zamiast:

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 
3

Można również użyć xxd (pochodzi z vim) do dekodowania HEX, przed przekazaniem go do base64:

(echo 0:; echo -n foo | md5sum) | xxd -rp -l 16 | base64