Golang SHA512 не соответствует OpenSSL SHA512 - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь создать SHA512 ha sh строки в bash, а затем проверяю, что SHA512 ha sh в golang. Однако я не могу определить точную комбинацию утилит / флагов для получения одного и того же ha sh в обоих местах.

Bash код:

echo "hello sha world" | openssl dgst -sha512 -hex
9c5b761a9bf8f74da84c57101669b8042b860ca5871a15c4e729758ad1dee58d562ddf8fa303ada1f3e0278fdff4af9a72f57ce0514be98f6a959daabda926f5

Golang код :

s := sha512.New()
s.Write([]byte(`hello sha world`))
fmt.Println(hex.EncodeToString(s.Sum(nil)))

d13fa494d2609a6f67e906de96d92788bd8ab46dec0f5e48d8cdb8c540628a752aa135262aa5804dcc907e261abe4472faf01fc13eb97e4e8c85e5c0438f2acb

Я также безуспешно пробовал кодировку base64 двоичного представления:

Bash:

echo "hello sha world"  | openssl dgst -sha512 | openssl base64 -A
OWM1Yjc2MWE5YmY4Zjc0ZGE4NGM1NzEwMTY2OWI4MDQyYjg2MGNhNTg3MWExNWM0ZTcyOTc1OGFkMWRlZTU4ZDU2MmRkZjhmYTMwM2FkYTFmM2UwMjc4ZmRmZjRhZjlhNzJmNTdjZTA1MTRiZTk4ZjZhOTU5ZGFhYmRhOTI2ZjUK

Golang:

s := sha512.New()
s.Write([]byte(`hello sha world`))
fmt.Println(base64.RawStdEncoding.EncodeToString(s.Sum(nil)))

0T+klNJgmm9n6QbeltkniL2KtG3sD15I2M24xUBiinUqoTUmKqWATcyQfiYavkRy+vAfwT65fk6MheXAQ48qyw

Любая помощь будет принята с благодарностью за то, как я могу получить Golang для генерации того же ha sh, что и openssl. Заранее спасибо!

1 Ответ

4 голосов
/ 06 августа 2020

Команда echo также отправляет символ новой строки, поэтому ваш первый пример вычисляет контрольную сумму SHA-512 строки "hello sha world\n".

Если вы используете то же самое в Go, вы получите тот же вывод:

s := sha512.New()
s.Write([]byte("hello sha world\n"))
fmt.Println(hex.EncodeToString(s.Sum(nil)))

Или просто:

fmt.Printf("%x\n", sha512.Sum512([]byte("hello sha world\n")))

Эти выходные данные (попробуйте на Go Playground ):

9c5b761a9bf8f74da84c57101669b8042b860ca5871a15c4e729758ad1dee58d562ddf8fa303ada1f3e0278fdff4af9a72f57ce0514be98f6a959daabda926f5

Если вы хотите вычислить извлечение SHA-512 некоторого текста в bash без завершающего символа новой строки, используйте параметр -n из echo следующим образом:

echo -n "hello sha world" | openssl dgst -sha512 -hex

Это выводит тот же самый код, что и исходный Go:

d13fa494d2609a6f67e906de96d92788bd8ab46dec0f5e48d8cdb8c540628a752aa135262aa5804dcc907e261abe4472faf01fc13eb97e4e8c85e5c0438f2acb

...