bash에서 두 변수의 내용은 동일하지만 길이가 다르다는 것을 알 수 있습니다.

bash에서 두 변수의 내용은 동일하지만 길이가 다르다는 것을 알 수 있습니다.

이 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.

관련 정보