Почему хэши 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