그래서 수신한 첨부 파일에 대한 SHA1 다이제스트를 계산하여(base64 인코딩) 다이제스트와 일치하도록 합니다. ChatGPT를 사용하여 아래 명령을 성공적으로 사용할 수 있었습니다. 그러나 나는 이 명령 xxd -r -p
이 왜 필요한지 이해하지 못합니다 .
sha1sum foo | awk '{print $1}' | xxd -r -p | base64
내가 이해하지 못하는 두 가지가 있습니다.
- 이 옵션이 왜
-p
필요한가요? 16진수 덤프의 바이너리 덤프를 수행하는 방법을 알고 있지만xxd -r
인쇄하지 않으면-p
아무 것도 인쇄되지 않으며 매뉴얼 페이지에는 stdout으로 인쇄해야 한다고 나와 있으며 이는-p
특정 출력 스타일에서만 작동합니다. - SHA1 다이제스트를 전달하는 목적은 무엇입니까
xxd
? 내 이해는xxd
본질적으로 16진수와 2진수 간에 데이터를 변환하는 것입니다. 하지만 을 사용하지 않고 위 명령을 실행하면xxd -r -p
다르고 일치하지 않는 출력이 표시됩니다. 나는 16진수 스타일/표현(SHA1 다이제스트의 형식)이 무엇인지 알고 있지만 이 맥락에서 "바이너리"가 무엇을 의미하는지 모를 수도 있습니다.
답변1
xxd -r p
먼저, 우리가 다루고 있는 내용을 이해하기 위해 입력을 살펴보겠습니다 . 예는 다음과 같습니다.
echo boo | sha1sum | awk '{print $1}'
6132b58967cf1ebc05062492c17145e5ee9f82a8
이 줄은 다음의 SHA1 해시를 생성합니다.4개문자 boo
와 그 후행 개행 문자.
xxd
이제 이 명령을 조금 연구해 봅시다 . xxd
의 매뉴얼 페이지(참고자료 참조)에서는 man xxd
이 xxd -r
명령이 에서 생성된 일반 16진수 덤프를 되돌린다고 설명합니다 xxd
. 따라서 다음과 같은 파이프라인을 구축할 수 있습니다.
echo boo | xxd | xxd -r
boo
이제 다음 두 출력을 비교해 보세요.
echo boo | xxd
00000000: 626f 6f0a boo.
echo boo | xxd -p
626f6f0a
두 번째 출력을 바이너리로 반전하려면 다음이 -r
필요합니다 -p
.
echo boo | xxd -p | xxd -r -p
boo
공백이나 다른 형식 없이 16진수 바이트로 생성된 이 구조는 xxd -p
의 출력과 정확히 일치하므로 sha1sum
이 방법을 사용하여 이진수로 변환할 수 있습니다. 그런 다음 (결국!) 결과 바이너리를 전달하여 Base 64로 base64
변환합니다 .
echo boo | sha1sum | awk '{print $1}' | xxd -r -p | base64
YTK1iWfPHrwFBiSSwXFF5e6fgqg=