"openssl dgst -sha1" produzindo um prefixo "(stdin)=" estranho e uma nova linha à direita

"openssl dgst -sha1" produzindo um prefixo "(stdin)=" estranho e uma nova linha à direita

Se você executar este comando em seu Unix

echo -n "foo" | openssl dgst -sha1

Você obterá esta saída:

(stdin)= 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

(seguido por uma nova linha).

Como posso forçar o openssl a não mostrar o (stdin)=prefixo e evitar a nova linha final?

Responder1

O formato binário bruto não adiciona nenhuma saída estranha.
Saída como binário e depois convertida para hexadecimal:

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

Vou te dar isso:

0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

Este método deve ser à prova de futuro caso alguém decida alterar o formato de saída textual novamente. Tenho certeza de que eles corrigirão o prefixo como "SHA1(stdin)=" para ser consistente com o de uma entrada de arquivo.

Não acredito que eles mudaram isso! Eu me pergunto quantos scripts foram quebrados.

Responder2

Observo esse comportamento no OpenSSL 1.0.0e no Ubuntu 11.10, enquanto o OpenSSL 0.9.8k e 0.9.8t geram apenas o hash. A linha de comando do OpenSSL não foi projetada para ser flexível, é mais uma maneira rápida e suja de realizar cálculos criptográficos a partir da linha de comando.

Se você quiser usar OpenSSL, filtre a saída:

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

No Linux (com ferramentas GNU ou BusyBox), você pode usarsha1sum, que não requer a instalação do OpenSSL e possui um formato de saída estável. Ele sempre imprime um nome de arquivo, então retire-o.

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

Em sistemas BSD incluindo OSX, você pode usarsha1.

echo -n "foo" | sha1 -q

Todos eles geram a soma de verificação em hexadecimal seguida por uma nova linha. O texto em sistemas Unix sempre consiste em uma sequência de linhas e cada linha termina com um caractere de nova linha. Se você armazenar a saída do comando em uma variável shell, a nova linha final será removida.

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

Se você precisar canalizar a entrada para um programa que requer uma soma de verificação sem nova linha final (o que é realmente raro), retire a nova linha.

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

Responder3

Aqui está outra alternativa:

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

Responder4

Aqui está uma maneira de fazer isso usando bash embutidos em vez de pipes, awk, sed, tr, cut, etc:

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

informação relacionada