“openssl dgst -sha1” produzindo um prefixo “(stdin) =” estranho e nova linha final

25

Se você executar este comando no seu Unix

echo -n "foo" | openssl dgst -sha1

Você receberá esta saída:

(stdin)= 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

(seguido por uma nova linha).

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

    
por Kevdog777 10.07.2012 / 18:03

4 respostas

16

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

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

Isso lhe dará isto:

0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

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

Eu não posso acreditar que eles mudaram isso! Gostaria de saber quantos scripts foram quebrados.

    
por 11.09.2013 / 15:09
15

Observo esse comportamento no OpenSSL 1.0.0e no Ubuntu 11.10, enquanto o OpenSSL 0.9.8k e 0.9.8t produzem apenas o hash. A linha de comando do OpenSSL não é 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 o OpenSSL, filtre a saída:

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

No Linux (com ferramentas GNU ou BusyBox), você pode usar sha1sum , o que não faz requer que o OpenSSL seja instalado e tenha um formato de saída estável. Ele sempre imprime um nome de arquivo, então tire isso.

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

Em sistemas BSD, incluindo o OSX, você pode usar sha1 .

echo -n "foo" | sha1 -q

Todos estes produzem 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 em um programa que requeira uma soma de verificação sem uma nova linha final (o que é realmente raro), remova a nova linha.

echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //' | tr -d '\n' | unusual_program
    
por 11.07.2012 / 11:35
6

Aqui está outra alternativa:

echo -n "foo" | openssl sha1 | awk '{print $2}'
    
por 20.09.2012 / 15:33
2

Aqui está uma maneira de fazer isso usando os built-ins do bash em vez de pipes, awk, sed, tr, cut, etc:

output="$(openssl sha1 <(printf foo))"; echo ${output/* }
    
por 08.02.2013 / 21:23

Tags