El contenido visible de 2 variables en bash es el mismo, pero la longitud es diferente

El contenido visible de 2 variables en bash es el mismo, pero la longitud es diferente

Estas 2 variables tendrán el mismo contenido visible

  x_sign1="aabbccdd_and_somthing_else"

  var1="...."
  [........]
  x_sign2=$(echo -n "${var1}${var2}${var3}" | shasum -a 256)
  echo $x_sign2

  ====> 
  aabbccdd_and_somthing_else -

Tenga en cuenta el "-" al final.

Sin embargo, sus longitudes serán diferentes. Aunque x_sign2no contiene un símbolo de nueva línea. Para garantizar esto:

  x_sign22=$(echo -n "${var1}${var2}${var3}" | shasum -a 256 | tr -d '\n')

Pero:

  echo ${#x_sign1}
  ====> 64
  And:

Y:

  echo ${#x_sign2}

  ====> 67

  echo ${#x_sign22}

  ====> 67

La diferencia son 3 símbolos. El contenido visible es idéntico.

Además, cuando hago una solicitud a través de curl a una API REST que necesita ese valor de firma, x_sign1siempre tiene éxito, mientras que x_sign2no: "firma incorrecta"

¿Por qué? ¿Cómo arreglar eso?

Respuesta1

$ echo foo |shasum -a 256
b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c  -    
                                                                ^^

Tenga en cuenta que haydosespacios en la salida shasumantes del nombre del archivo. Cuando la entrada se toma de la entrada estándar, shasumimprime un guión como nombre de archivo.

Si ejecuta, echo foo | shasum | od -cpuede verificar eso y ver también la nueva línea al final. La nueva línea, sin embargo, se elimina mediante la sustitución del comando, por lo que eliminarla explícitamente trno hace nada. (veraquíyaquí)

Los dos espacios y el guión son tres caracteres que provocan la diferencia en tus conteos.

Para obtener solo el hash, puedes usar expansiones de parámetros para eliminar cualquier cosa después del primer espacio, por ejemplo:

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

Se ${var%%pattern}expande al valor de varcon la coincidencia de sufijo más larga patterneliminada.

información relacionada