2011-01-03 21 views
22

Ho bisogno di codificare l'hash md5 alla base 64. Il problema è che se date l'output del comando md5sum al comando base64, è considerato come un testo e non come un dato esadecimale. Come gestirlo? Il comando Base64 non ha alcuna opzione per impostarlo come un numero esadecimale.Come codificare md5 sum in base64 in BASH

Grazie per qualsiasi aiuto.

risposta

42

Utilizzare openssl dgst -md5 -binary anziché md5sum. Se lo desideri, puoi usarlo anche su base64-encode, per usare solo un programma per tutti gli usi.

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

(openssl md5 invece di openssl dgst -md5 lavora troppo, ma penso che sia meglio essere espliciti)

+0

Grazie molto. Funziona bene. –

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

In busybox si potrebbe non essere in grado di utilizzare per la sintassi del ciclo. Qui di seguito unhex() è implementata con un ciclo while, invece:

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

È inoltre possibile utilizzare xxd (viene fornito con vim) per decodificare l'esagono, prima di passarlo al Base64:

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