"openssl dgst -sha1" produce un prefijo "(stdin)=" extraño y una nueva línea final

"openssl dgst -sha1" produce un prefijo "(stdin)=" extraño y una nueva línea final

Si ejecuta este comando en su Unix

echo -n "foo" | openssl dgst -sha1

Obtendrá este resultado:

(stdin)= 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

(seguido de una nueva línea).

¿Cómo puedo forzar a openssl a no mostrar el (stdin)=prefijo y evitar la nueva línea final?

Respuesta1

El formato binario sin formato no agrega ninguna salida superflua.
Salida como binario y luego convertir a hexadecimal:

echo -n "foo" | openssl dgst -sha1 -binary | xxd -p

Te daré esto:

0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

Este método debería estar preparado para el futuro en caso de que alguien decida cambiar el formato de salida del texto nuevamente. Estoy seguro de que arreglarán el prefijo para que sea "SHA1(stdin)=" para que sea coherente con el de la entrada de un archivo.

¡No puedo creer que hayan cambiado esto! Me pregunto cuántos guiones se rompieron.

Respuesta2

Observo este comportamiento en OpenSSL 1.0.0e en Ubuntu 11.10, mientras que OpenSSL 0.9.8k y 0.9.8t generan solo el hash. La línea de comando de OpenSSL no está diseñada para ser flexible, es más bien una forma rápida y sencilla de realizar cálculos criptográficos desde la línea de comando.

Si desea utilizar OpenSSL, filtre la salida:

echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //'

En Linux (con herramientas GNU o BusyBox), puedes usarsha1sum, que no requiere la instalación de OpenSSL y tiene un formato de salida estable. Siempre imprime un nombre de archivo, así que quítelo.

echo -n "foo" | sha1sum | sed 's/ .*//'

En sistemas BSD, incluido OSX, puede utilizarsha1.

echo -n "foo" | sha1 -q

Todos estos generan la suma de verificación en hexadecimal seguida de una nueva línea. El texto en sistemas Unix siempre consta de una secuencia de líneas y cada línea termina con un carácter de nueva línea. Si almacena la salida del comando en una variable de shell, la nueva línea final se elimina.

digest=$(echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //')

Si necesita canalizar la entrada a un programa que requiere una suma de verificación sin una nueva línea final (lo cual es realmente raro), elimine la nueva línea.

echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //' | tr -d '\n' | unusual_program

Respuesta3

Aquí hay otra alternativa:

echo -n "foo" | openssl sha1 | awk '{print $2}'

Respuesta4

Aquí hay una manera de hacerlo usando funciones integradas de bash en lugar de pipes, awk, sed, tr, cut, etc.:

output="$(openssl sha1 <(printf foo))"; echo ${output/* }

información relacionada