
이 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
파일 이름 앞 의 출력에 공백이 있습니다 . stdin에서 입력을 가져오면 shasum
파일 이름으로 대시를 인쇄합니다.
실행하면 echo foo | shasum | od -c
이를 확인할 수 있고 끝에 개행 문자도 표시됩니다. 그러나 개행 문자는 명령 대체에 의해 제거되므로 명시적으로 제거해도 tr
아무 작업도 수행되지 않습니다. (보다여기그리고여기)
두 개의 공백과 대시는 카운트에 차이를 일으키는 세 개의 문자입니다.
해시만 얻으려면 매개변수 확장을 사용하여 첫 번째 공백 뒤의 모든 항목을 제거할 수 있습니다. 예:
$ h=$(echo foo | shasum -a 256)
$ h=${h%% *}
$ printf ">%s<\n" "$h"
>b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c<
일치하는 가장 긴 접미사가 제거된 ${var%%pattern}
값으로 확장 됩니다 .var
pattern