これら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
。