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/* }