Diferentes métodos para obter o SHA1 fornecem resultados diferentes

2

Estou aprendendo sobre SHA1 (especificamente wrt Git), e eu queria checar meu entendimento calculando o SHA1 de uma string com diferentes métodos - eu esperava hashes SHA1 idênticos, mas ao invés disso eu obtive resultados distintos de três dos quatro métodos :

>git hash-object --stdin <<< "Apple Pie"
23991897e13e47ed0adb91a0082c31c82fe0cbe5

.

>sha1sum <<< "blob 9
>printf 'blob 9
>openssl sha1 foo.txt
SHA1(foo.txt)= 9eed377bbdeb4aa5d14f8df9cd50fed042f41023
Apple Pie' > foo.txt >sha1sum foo.txt 9eed377bbdeb4aa5d14f8df9cd50fed042f41023 foo.txt
Apple Pie" 332cd56150dc8b954c0b859bd4aa6092beafa00f -

.

>git hash-object --stdin <<< "Apple Pie"
23991897e13e47ed0adb91a0082c31c82fe0cbe5

.

>sha1sum <<< "blob 9
>printf 'blob 9
>openssl sha1 foo.txt
SHA1(foo.txt)= 9eed377bbdeb4aa5d14f8df9cd50fed042f41023
Apple Pie' > foo.txt >sha1sum foo.txt 9eed377bbdeb4aa5d14f8df9cd50fed042f41023 foo.txt
Apple Pie" 332cd56150dc8b954c0b859bd4aa6092beafa00f -

A resposta aceita para esta A pergunta sobre estouro de pilha diz que git hash-object executa um hash SHA1 no conteúdo especificado prefixado com "blob [file size] / 0". Assim, eu prefixei explicitamente esse texto para as strings que testei com o método não-git.

Por que todos esses resultados diferentes? Eu pensei que SHA1 era um hash específico e único de uma determinada string, e que não havia diferentes "tipos" de SHA1 - isso não é verdade?

    
por StoneThrow 14.05.2017 / 22:42

1 resposta

4

As diferenças não vêm do SHA1, mas da entrada. A sintaxe here-string acrescenta uma nova linha, como podemos ver com od :

$ od -c <<< foo
0000000   f   o   o  \n

Portanto, no seu comando git , a entrada é os dez caracteres Apple Pie\n .

Além disso, as aspas duplas usadas nas strings here não suportam escapes de barra invertida como \n ou \nnn , então <<< "blob 9printfApple Pie" fornece uma string contendo uma barra invertida literal e um zero.

$'' no entanto interpreta zsh como o byte NUL, e não adiciona uma nova linha à direita, então com a nova linha adicionada e o tamanho fixo, devemos obter a saída esperada:

$ printf 'blob 10
$ zsh -c "sha1sum <<< $'blob 10
$ od -c <<< foo
0000000   f   o   o  \n
Apple Pie'" 23991897e13e47ed0adb91a0082c31c82fe0cbe5 -
Apple Pie\n' | sha1sum 23991897e13e47ed0adb91a0082c31c82fe0cbe5 -

Poderíamos tentar fazer o mesmo com a string here usando o %code% quote que suporta %code% representando o byte NUL, mas isso pode não funcionar em todos os shells, pois o byte NUL termina a string. Por exemplo. Bash não pode lidar com isso, %code% can:

$ printf 'blob 10
$ zsh -c "sha1sum <<< $'blob 10%pre%Apple Pie'"
23991897e13e47ed0adb91a0082c31c82fe0cbe5  -
Apple Pie\n' | sha1sum 23991897e13e47ed0adb91a0082c31c82fe0cbe5 -
    
por 14.05.2017 / 23:48

Tags