
Estas 2 variáveis terão o mesmo conteúdo visível
x_sign1="aabbccdd_and_somthing_else"
var1="...."
[........]
x_sign2=$(echo -n "${var1}${var2}${var3}" | shasum -a 256)
echo $x_sign2
====>
aabbccdd_and_somthing_else -
Observe o "-" no final.
No entanto, os seus comprimentos serão diferentes. Mesmo que x_sign2
não contenha um símbolo de nova linha. Para garantir isso:
x_sign22=$(echo -n "${var1}${var2}${var3}" | shasum -a 256 | tr -d '\n')
Mas:
echo ${#x_sign1}
====> 64
And:
E:
echo ${#x_sign2}
====> 67
echo ${#x_sign22}
====> 67
A diferença é de 3 símbolos. O conteúdo visível é idêntico.
Além disso, quando faço uma solicitação via curl para uma API REST que precisa desse valor de assinatura, x_sign1
sempre é bem-sucedida, mas x_sign2
não - "assinatura errada"
Por que? Como consertar isso?
Responder1
$ echo foo |shasum -a 256
b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c -
^^
Observe que existemdoisespaços na saída shasum
antes do nome do arquivo. Quando a entrada é obtida de stdin, shasum
imprime um travessão como nome do arquivo.
Se você executar, echo foo | shasum | od -c
poderá verificar isso e ver também a nova linha no final. A nova linha, no entanto, é removida pela substituição do comando, portanto, removê-la explicitamente tr
não faz nada. (veraquieaqui)
Os dois espaços e o travessão são três caracteres que causam a diferença nas suas contagens.
Para obter apenas o hash, você pode usar expansões de parâmetros para remover qualquer coisa após o primeiro espaço, por exemplo:
$ h=$(echo foo | shasum -a 256)
$ h=${h%% *}
$ printf ">%s<\n" "$h"
>b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c<
O ${var%%pattern}
expande para o valor de var
com a correspondência de sufixo mais longa pattern
removida.