Почему хэши SHA256 заканчиваются на"="?

Я сделал веб-сервис, который возвращает маркер безопасности после успешной аутентификации.

однако при отладке я заметил, что каждый хэш, возвращаемый веб-сервисом, заканчивается на"=", например:

"tINH0JxmryvB6pRkEii1iBYP7FRedDqIEs0Ppbw83oc="
"INv7q72C1HvIixY1qmt5tNASFBEc0PnXRSb780Y5aeI="
"QkM8Kog8TtCczysDmKu6ZOjwwYlcR2biiUzxkb3uBio="
"6eNuCU6RBkwKMmVV6Mhm0Q0ehJ8Qo5SqcGm3LIl62uQ="
"dAPKN8aHl5tgKpmx9vNoYvXfAdF+76G4S+L+ep+TzU="
"O5qQNLEjmmgCIB0TOsNOPCHiquq8ALbHHLcWvWhMuI="
"N9ERYp+i7yhEblAjaKaS3qf9uvMja0odC7ERYllHCI="
"wsBTpxyNLVLbJEbMttFdSfOwv6W9rXba4GGodVVxgo="
"sr+nF83THUjYcjzRVQbnDFUQVTkuZOZYe3D3bmF1D8="
"9EosvgyYOG5a136S54HVmmebwiBJJ8a3qGVWD878j5k="
"8ORZmAXZ4dlWeaMOsyxAFphwKh9SeimwBzf8eYqTis="
"gVepn2Up5rjVplJUvDHtgIeaBL+X6TPzm2j9O2JTDFI="

почему такое поведение ?

2 ответов


Это потому, что вы не видите необработанные байты хэша, а в кодировке base64.

Base64-encoding преобразует блок из 3 байт в блок из четырех символов. Это хорошо работает, если количество байтов делится на 3. Если это не так, то вы используете символ заполнения, поэтому количество результирующих символов по-прежнему делится на 4.

Так:

(no of bytes)%3 = 0  => no padding needed
(no of bytes)%3 = 1  => pad with ==
(no of bytes)%3 = 2  => pad with =

хэш SHA256 - это 256 бит, это 32 байта. Таким образом, вы получите 40 символов за первые 30 байты, 3 символа для последних 2 байтов и заполнение всегда будет один =.


эти строки кодируются с помощью в base64, = символы используются в качестве отступов, чтобы последний блок строки base64 содержал четыре символа.


для получения декодированной строки base64 можно использовать следующий код Ruby:

require 'base64'

s = "tINH0JxmryvB6pRkEii1iBYP7FRedDqIEs0Ppbw83oc="
puts Base64.decode64(s).bytes.map{|e| '%02x' % e}.join

выход: b48347d09c66af2bc1ea94641228b588160fec545e743a8812cd0fa5bc3cde87