bashでは、2つの変数の内容は同じですが、長さが異なることがわかります。

bashでは、2つの変数の内容は同じですが、長さが異なることがわかります。

これら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しません。 (望むよりここそしてここ)

2つのスペースとダッシュは、計算に違いを引き起こす3文字です。

ハッシュのみを取得するには、パラメータ拡張を使用して、次のように最初のスペースの後にあるすべてのエントリを削除できます。

$ h=$(echo foo | shasum -a 256)
$ h=${h%% *}
$ printf ">%s<\n" "$h"
>b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c<

${var%%pattern}値に展開しvar、一致する最も長いサフィックスを削除しますpattern

おすすめ記事