“openssl dgst-sha1”, производящий постороннее “(stdin) =” префикс и запаздывающая новая строка

Я знаю, что многие люди используют XMonad. Это высоконастраиваемо и scriptable, это интегрируется с GNOME и т.д. Единственный 'недостаток' - то, что это использует Haskell, beatyful, но не так популярный purly функциональный язык.

31
10.08.2012, 17:19
4 ответа

Я наблюдаю это поведение под OpenSSL 1.0.0e на Ubuntu 11.10, тогда как OpenSSL 0.9.8k и 0.9.8 т производил просто хеш. Командная строка 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
16
27.01.2020, 19:38

Вот другая альтернатива:

echo -n "foo" | openssl sha1 | awk '{print $2}'
6
27.01.2020, 19:38
  • 1
    я знаю вопрос, спрашивает с этим определенным форматом, однако, если кто-то пытается расширить это для включения имен файлов, он мог бы повредиться, если имя файла имеет пробелы в нем. Просто головы для других людей, которые приземляются здесь. –  Cameron Gagnon 22.09.2016, 06:38

Вот способ сделать это с помощью удара, созданного-ins вместо каналов, awk, sed, TR, сократить, и т.д.:

output="$(openssl sha1 <(printf foo))"; echo ${output/* }
2
27.01.2020, 19:38

Необработанный двоичный формат не добавляет постороннего вывода.
Вывод как двоичный файл затем преобразовывает в шестнадцатеричное число:

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

Даст Вам это:

0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

Этот метод должен соответствовать требованиям завтрашнего дня в случае, если кто-то решает изменить текстовый выходной формат снова. Я уверен, что они зафиксируют префикс, чтобы быть "SHA1 (stdin) =", чтобы согласовываться с префиксом входа файла.

Я не могу полагать, что они изменили это! Интересно, сколько сценариев было повреждено.

22
27.01.2020, 19:38
  • 1
    Это только произведет 20-30 октетов на строку (или 40-60 символов). Для контрольной суммы SHA-256 это недостаточно иногда. Используйте -c 256 опция расширить его до 256 октетов на строку. –  Rockallite 17.01.2017, 11:02

Теги

Похожие вопросы