Я наблюдаю такое поведение под OpenSSL 1.0.0e на Ubuntu 11.10, тогда как OpenSSL 0.9.8k и 0.9.8t выводят только хеш. Командная строка OpenSSL не предназначена для гибкости, это скорее быстрый и грязный способ выполнения криптографических вычислений из командной строки.
Если вы хотите использовать OpenSSL, отфильтруйте вывод:
echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //'
В Linux (с инструментами GNU или BusyBox) вы можете использовать sha1sum
, который не требует установки OpenSSL и имеет стабильный формат вывода. Он всегда печатает имя файла, поэтому удалите его.
echo -n "foo" | sha1sum | sed 's/ .*//'
На системах BSD, включая OSX, вы можете использовать sha1
.
echo -n "foo" | sha1 -q
Все они выводят контрольную сумму в шестнадцатеричном формате с последующим переводом строки. Текст в системах Unix всегда состоит из последовательности строк, и каждая строка заканчивается символом новой строки. Если вы сохраните вывод команды в переменной оболочки, последний символ новой строки будет удален.
digest=$(echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //')
Если вам нужно передать данные в программу, которая требует контрольной суммы без окончательного перевода строки (что действительно редко), удалите перевод строки.
echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //' | tr -d '\n' | unusual_program