스크립트의 문자열에 SHA256 및 Base64 적용

스크립트의 문자열에 SHA256 및 Base64 적용

SHA256을 적용한 다음 Base64로 쉘 스크립트의 문자열을 인코딩하려고 합니다. PHP와 함께 작동하게 하기: php -r 'echo base64_encode(hash("sha256", "asdasd", false));'.하지만 저는 PHP에 대한 의존성을 없애려고 노력하고 있습니다.

다음 코드 줄은 터미널에서 정상적으로 실행됩니다( shell 사용 fish).

$ echo -n "asdasd" | shasum -a 256 | cut -d " " -f 1 | xxd -r -p | base64
X9kkYl9qsWoZzJgHx8UGrhgTSQ5LpnX4Q9WhDguqzbg=

그러나 이를 쉘 스크립트에 넣으면 결과가 달라집니다.

$ cat foo.sh
#!/bin/sh
echo -n "asdasd" | shasum -a 256 | cut -d " " -f 1 | xxd -r -p | base64
$ ./foo.sh
IzoDcfWvzNTZi62OfVm7DBfYrU9WiSdNyZIQhb7vZ0w=

예상한 결과를 생성하려면 어떻게 해야 합니까? 내 생각엔 이것이 이진 문자열이 처리되는 방식 때문인 것 같습니다.

답변1

문제는 다른 쉘을 사용하고 있다는 것입니다. 이 echo명령은 대부분의 쉘에 내장된 쉘이며 구현마다 다르게 작동합니다. 이제 기본 쉘은 다음과 같습니다 fish. 따라서 이 명령을 실행하면 다음과 같습니다.

~> echo -n "asdasd" | shasum -a 256 | cut -d " " -f 1 | xxd -r -p | base64
X9kkYl9qsWoZzJgHx8UGrhgTSQ5LpnX4Q9WhDguqzbg=

위와 같이 출력이 표시됩니다. 이는 지원 echo때문 입니다. 분명히 지원하지 않는 시스템 이 있습니다 . 이해하지 못하는 경우 실제로 인쇄되는 내용은 무엇입니까 ? 이를 설명하기 위해 다음을 사용하여 인쇄해 보겠습니다.fish-n/bin/shecho-necho-n-n asdasd\nprintf

$ printf -- "-n asdasd\n" 
-n asdasd

이제 이것을 파이프라인에 넣으면 다음과 같습니다.

$ printf -- "-n asdasd\n" | shasum -a 256 | cut -d " " -f 1 | xxd -r -p | base64
IzoDcfWvzNTZi62OfVm7DBfYrU9WiSdNyZIQhb7vZ0w=

이는 스크립트에서 얻은 출력입니다. 그래서 실제로 일어나는 일은 echo -n "asdasd"그것이 인쇄된다는 것입니다.-n 그리고후행 개행 문자. 간단한 해결책은 printf대신 사용하는 것입니다 echo.

$ printf "asdasd" | shasum -a 256 | cut -d " " -f 1 | xxd -r -p | base64
X9kkYl9qsWoZzJgHx8UGrhgTSQ5LpnX4Q9WhDguqzbg=

위의 내용은 명령줄에서 스크립트에서와 동일하게 작동하며 시도하려는 모든 셸에서 작동해야 합니다. 또 다른 이유가 있습니다printf비교하다echo.

관련 정보