Jeśli uruchomisz to polecenie na swoim Uniksie
echo -n "foo" | openssl dgst -sha1
Otrzymasz ten wynik:
(stdin)= 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33
(po którym następuje nowa linia).
Jak zmusić openssl, aby nie pokazywał (stdin)=
prefiksu i unikał końcowego znaku nowej linii?
Odpowiedzi:
Surowy format binarny nie dodaje żadnych dodatkowych danych wyjściowych.
Wyjście w postaci binarnej, a następnie konwersja na hex:
Dam ci to:
Ta metoda powinna być przyszłościowa na wypadek, gdyby ktoś postanowił ponownie zmienić tekstowy format wyjściowy. Jestem pewien, że poprawią prefiks na „SHA1 (stdin) =”, aby był zgodny z prefiksem pliku wejściowego.
Nie mogę uwierzyć, że to zmienili! Zastanawiam się, ile skryptów zostało złamanych.
źródło
-c 256
opcji, aby rozszerzyć go do 256 oktetów na linię.Obserwuję to zachowanie w OpenSSL 1.0.0e na Ubuntu 11.10, podczas gdy OpenSSL 0.9.8k i 0.9.8t wyprowadza tylko skrót. Linia poleceń OpenSSL nie została zaprojektowana jako elastyczna, jest to raczej szybki i brudny sposób wykonywania obliczeń kryptograficznych z linii poleceń.
Jeśli chcesz użyć OpenSSL, odfiltruj dane wyjściowe:
W systemie Linux (z narzędziami GNU lub BusyBox) możesz używać
sha1sum
, który nie wymaga instalacji OpenSSL i ma stabilny format wyjściowy. Zawsze drukuje nazwę pliku, więc usuń ją.W systemach BSD, w tym OSX, możesz używać
sha1
.Wszystkie z nich generują sumę kontrolną w systemie szesnastkowym, po której następuje nowa linia. Tekst w systemach uniksowych zawsze składa się z sekwencji linii, a każda linia kończy się znakiem nowej linii. Jeśli przechowujesz dane wyjściowe polecenia w zmiennej powłoki, ostatnia nowa linia jest usuwana.
Jeśli potrzebujesz wprowadzić dane wejściowe do programu, który wymaga sumy kontrolnej bez końcowej nowej linii (co jest naprawdę rzadkie), usuń nową linię.
źródło
Oto kolejna alternatywa:
źródło
Oto sposób na zrobienie tego za pomocą wbudowanych bashów zamiast rur, awk, sed, tr, cut itp.
źródło