"openssl dgst -sha1"은 불필요한 "(stdin)= " 접두사와 후행 개행 문자를 생성합니다.

"openssl dgst -sha1"은 불필요한 "(stdin)= " 접두사와 후행 개행 문자를 생성합니다.

Unix에서 이 명령을 실행하면

echo -n "foo" | openssl dgst -sha1

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

(stdin)= 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

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

(stdin)=openssl이 접두사를 표시하지 않고 후행 개행을 방지하도록 하려면 어떻게 해야 합니까 ?

답변1

원시 바이너리 형식은 외부 출력을 추가하지 않습니다.
바이너리로 출력한 후 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진수와 개행 문자로 체크섬을 출력합니다. 유닉스 시스템의 텍스트는 항상 일련의 줄로 구성되며 각 줄은 개행 문자로 끝납니다. 명령의 출력을 쉘 변수에 저장하면 마지막 줄 바꿈이 제거됩니다.

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/* }

관련 정보