
これら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にcurl経由でリクエストを送信すると、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