Der sichtbare Inhalt von 2 Variablen in Bash ist gleich, aber die Länge ist unterschiedlich

Der sichtbare Inhalt von 2 Variablen in Bash ist gleich, aber die Länge ist unterschiedlich

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_sign2kein 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_sign1ist sie immer erfolgreich, während x_sign2sie 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 shasumvor dem Dateinamen. Wenn die Eingabe von stdin erfolgt, shasumwird ein Bindestrich als Dateiname gedruckt.

Wenn Sie ausführen, echo foo | shasum | od -ckö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 trnichts 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, varwobei die längste Suffixübereinstimmung patternentfernt wird.

verwandte Informationen