“openssl dgst -sha1”은 불필요한“(stdin) =”접두사를 생성하고 후행 줄 바꿈을 생성합니다


31

유닉스에서이 명령을 실행하면

echo -n "foo" | openssl dgst -sha1

이 출력을 얻을 수 있습니다 :

(stdin)= 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

(개행 문자가 뒤 따름).

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


@MarkDavidson 흠, 흥미로운. 줄 바꿈을 추가하지 않습니까?

답변:


22

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

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

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

0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

누군가가 텍스트 출력 형식을 다시 변경하기로 결정한 경우이 방법은 미래에 대비해야합니다. 파일 입력의 접두사와 일치하도록 접두어를 "SHA1 (stdin) ="로 수정합니다.

나는 그들이 이것을 바꾸 었다는 것을 믿을 수 없다! 몇 개의 스크립트가 깨 졌는지 궁금합니다.


4
한 줄에 20-30 옥텟 (또는 40-60 자) 만 출력합니다. SHA-256 체크섬의 경우 때때로 충분하지 않습니다. -c 256옵션을 사용하여 한 줄에 256 옥텟으로 확장하십시오.
Rockallite

16

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

이것은 완벽한 상황 => 솔루션 맵 복사 및 붙여 넣기입니다. 감사!
oberstet

6

다른 대안이 있습니다.

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

1
질문 에이 특정 형식으로 묻는다는 것을 알고 있지만 누군가 파일 이름을 포함하도록 확장하려고하면 파일 이름에 공백이 있으면 중단 될 수 있습니다. 여기에 착륙하는 다른 사람들을 위해 머리를 숙입니다.
Cameron Gagnon

2

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

output="$(openssl sha1 <(printf foo))"; echo ${output/* }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.