Aplicar SHA256 e Base64 para string no script

1

Estou tentando aplicar SHA256 e, em seguida, Base64 codificar uma string dentro de um script de shell. Entendi trabalhando com PHP: %código%. Mas estou tentando me livrar da dependência do PHP.

Tenho esta linha que funciona bem no terminal (usando o php -r 'echo base64_encode(hash("sha256", "asdasd", false));' shell):

$ echo -n "asdasd" | shasum -a 256 | cut -d " " -f 1 | xxd -r -p | base64
X9kkYl9qsWoZzJgHx8UGrhgTSQ5LpnX4Q9WhDguqzbg=

Mas quando eu coloco dentro de um script de shell, o resultado é diferente:

$ cat foo.sh
#!/bin/sh
echo -n "asdasd" | shasum -a 256 | cut -d " " -f 1 | xxd -r -p | base64
$ ./foo.sh
IzoDcfWvzNTZi62OfVm7DBfYrU9WiSdNyZIQhb7vZ0w=

Como posso produzir o resultado esperado? Meu palpite é que é por causa de como as cadeias binárias são manipuladas?

    
por Niklas Berglund 09.12.2015 / 11:05

1 resposta

1

O problema é que você está usando shells diferentes. O comando echo é um shell embutido para a maioria dos shells e cada implementação se comporta de maneira diferente. Agora, você disse que seu shell padrão é fish . Então, quando você executar este comando:

~> echo -n "asdasd" | shasum -a 256 | cut -d " " -f 1 | xxd -r -p | base64
X9kkYl9qsWoZzJgHx8UGrhgTSQ5LpnX4Q9WhDguqzbg=

você receberá a saída mostrada acima. Isso ocorre porque o echo de fish suporta -n . Aparentemente, no seu sistema, /bin/sh é um shell cujo echo não suporta -n . Se o echo não entender -n , o que realmente está sendo impresso é -n asdasd\n . Para ilustrar, vamos usar printf para imprimir exatamente isso:

$ printf -- "-n asdasd\n" 
-n asdasd

Agora, se passarmos pelo seu canal:

$ printf -- "-n asdasd\n" | shasum -a 256 | cut -d " " -f 1 | xxd -r -p | base64
IzoDcfWvzNTZi62OfVm7DBfYrU9WiSdNyZIQhb7vZ0w=

Essa é a saída que você obtém do seu script. Então, o que acontece é que echo -n "asdasd" está realmente imprimindo a -n e uma nova linha à direita. Uma solução simples é usar printf em vez de echo :

$ printf "asdasd" | shasum -a 256 | cut -d " " -f 1 | xxd -r -p | base64
X9kkYl9qsWoZzJgHx8UGrhgTSQ5LpnX4Q9WhDguqzbg=

Os itens acima funcionarão da mesma forma na linha de comando e no seu script e devem ser feitos com qualquer shell que você queira tentar. Ainda outra razão pela qual printf é melhor que echo .

    
por 09.12.2015 / 12:14