이 2개의 변수는 동일한 표시 내용을 갖습니다.
x_sign1="aabbccdd_and_somthing_else"
var1="...."
[........]
x_sign2=$(echo -n "${var1}${var2}${var3}" | shasum -a 256)
echo $x_sign2
====>
aabbccdd_and_somthing_else -
끝에 "-"를 주목하세요.
그러나 길이는 다양합니다. x_sign2
개행 문자가 포함되어 있지 않더라도 마찬가지입니다 . 이를 보장하려면:
x_sign22=$(echo -n "${var1}${var2}${var3}" | shasum -a 256 | tr -d '\n')
하지만:
echo ${#x_sign1}
====> 64
And:
그리고:
echo ${#x_sign2}
====> 67
echo ${#x_sign22}
====> 67
차이점은 3개의 기호입니다. 보이는 내용은 동일합니다.
또한 해당 서명 값이 필요한 REST API에 컬을 통해 요청하면 "서명 오류" 없이 x_sign1
항상 성공합니다 .x_sign2
왜? 이 문제를 어떻게 해결하나요?
답변1
$ echo foo |shasum -a 256
b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c -
^^
있습니다.둘출력에서 shasum
파일 이름 앞에 공백이 있습니다 . 표준 입력에서 입력을 받을 때 shasum
대시를 파일 이름으로 인쇄합니다.
실행하면 echo foo | shasum | od -c
확인하고 끝에 개행 문자가 표시되는 것을 볼 수 있습니다. 그러나 개행 문자는 명령 대체를 통해 제거되므로 이를 제거해도 명시적으로 tr
아무 작업도 수행되지 않습니다. (바라보다여기그리고여기)
두 개의 공백과 대시는 계산에 차이를 일으키는 세 문자입니다.
해시만 얻으려면 매개변수 확장을 사용하여 다음과 같이 첫 번째 공백 뒤의 모든 항목을 제거할 수 있습니다.
$ h=$(echo foo | shasum -a 256)
$ h=${h%% *}
$ printf ">%s<\n" "$h"
>b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c<
${var%%pattern}
값으로 확장 var
하고 일치하는 가장 긴 접미사를 제거합니다 pattern
.