"openssl dgst -sha1"은 관련 없는 "(stdin)=" 접두사와 후행 개행 문자를 생성합니다.

"openssl dgst -sha1"은 관련 없는 "(stdin)=" 접두사와 후행 개행 문자를 생성합니다.

Unix에서 이 명령을 실행하는 경우

echo -n "foo" | openssl dgst -sha1

다음과 같은 결과가 출력됩니다.

(stdin)= 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

(다음에 개행 문자가 옵니다).

openssl이 접두사를 표시하지 않고 (stdin)=후행 개행을 피하도록 강제하는 방법은 무엇입니까?

답변1

원시 바이너리 형식은 외부 출력을 추가하지 않습니다.
출력은 2진수이며 16진수로 변환됩니다.

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

당신에게 이것을 줄 것입니다 :

0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

누군가가 텍스트 출력 형식을 다시 변경하기로 결정한 경우 이 방법은 미래에도 사용할 수 있습니다. 파일 입력의 접두사와 일관성을 유지하기 위해 "SHA1(stdin)=" 접두사를 수정할 것이라고 확신합니다.

나는 그들이 이것을 바꾸었다는 것을 믿을 수 없습니다! 얼마나 많은 스크립트가 깨졌는지 궁금합니다.

답변2

Ubuntu 11.10의 OpenSSL 1.0.0e에서 이 동작을 관찰한 반면 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/ .*//'

OSX를 포함한 BSD 시스템에서는 다음을 사용할 수 있습니다.sha1.

echo -n "foo" | sha1 -q

이들 모두는 16진수로 체크섬을 출력하고 그 뒤에 개행 문자가 옵니다. Unix 시스템의 텍스트는 항상 일련의 줄로 구성되며, 각 줄은 개행 문자로 끝납니다. 명령의 출력이 쉘 변수에 저장되면 마지막 개행 문자가 제거됩니다.

digest=$(echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //')

최종 개행 없이 체크섬을 요구하는 프로그램에 입력을 파이프해야 하는 경우(실제로는 드물지만) 개행을 제거하십시오.

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

답변3

또 다른 옵션은 다음과 같습니다.

echo -n "foo" | openssl sha1 | awk '{print $2}'

답변4

파이프, awk, sed, tr, cut 등 대신 bash 내장 기능을 사용하여 이를 수행하는 방법은 다음과 같습니다.

output="$(openssl sha1 <(printf foo))"; echo ${output/* }

관련 정보