
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_sign2
no 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_sign1
siempre tiene éxito, mientras que x_sign2
no: "firma incorrecta"
¿Por qué? ¿Cómo arreglar eso?
Respuesta1
$ echo foo |shasum -a 256
b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c -
^^
Tenga en cuenta que haydosespacios en la salida shasum
antes del nombre del archivo. Cuando la entrada se toma de la entrada estándar, shasum
imprime un guión como nombre de archivo.
Si ejecuta, echo foo | shasum | od -c
puede 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 tr
no 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 var
con la coincidencia de sufijo más larga pattern
eliminada.