
Diese beiden Variablen haben den gleichen sichtbaren Inhalt
x_sign1="aabbccdd_and_somthing_else"
var1="...."
[........]
x_sign2=$(echo -n "${var1}${var2}${var3}" | shasum -a 256)
echo $x_sign2
====>
aabbccdd_and_somthing_else -
Beachten Sie das „-“ am Ende.
Ihre Längen sind jedoch unterschiedlich. Auch wenn x_sign2
kein neues Zeilensymbol enthalten ist. Um dies sicherzustellen:
x_sign22=$(echo -n "${var1}${var2}${var3}" | shasum -a 256 | tr -d '\n')
Aber:
echo ${#x_sign1}
====> 64
And:
Und:
echo ${#x_sign2}
====> 67
echo ${#x_sign22}
====> 67
Der Unterschied beträgt 3 Symbole. Der sichtbare Inhalt ist identisch.
Wenn ich eine Anfrage per curl an eine REST-API stelle, die diesen Signaturwert benötigt, x_sign1
ist sie immer erfolgreich, während x_sign2
sie nicht erfolgreich ist -- „falsche Signatur“
Warum? Wie kann man das beheben?
Antwort1
$ echo foo |shasum -a 256
b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c -
^^
Beachten Sie, dass eszweiLeerzeichen in der Ausgabe shasum
vor dem Dateinamen. Wenn die Eingabe von stdin erfolgt, shasum
wird ein Bindestrich als Dateiname gedruckt.
Wenn Sie ausführen, echo foo | shasum | od -c
können Sie das überprüfen und auch die neue Zeile am Ende sehen. Die neue Zeile wird jedoch durch die Befehlsersetzung entfernt, sodass das explizite Entfernen mit tr
nichts bewirkt. (sieheHierUndHier)
Die beiden Leerzeichen und der Bindestrich sind drei Zeichen, die den Unterschied in Ihren Zählungen verursachen.
Um nur den Hash zu erhalten, können Sie Parametererweiterungen verwenden, um alles nach dem ersten Leerzeichen zu entfernen, z. B.:
$ h=$(echo foo | shasum -a 256)
$ h=${h%% *}
$ printf ">%s<\n" "$h"
>b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c<
Dies ${var%%pattern}
wird auf den Wert erweitert, var
wobei die längste Suffixübereinstimmung pattern
entfernt wird.