我做了一个Web服务,在成功验证后返回一个安全令牌。
然而,在调试时,我注意到webservice返回的每个哈希都以" ="结束。如:
"tINH0JxmryvB6pRkEii1iBYP7FRedDqIEs0Ppbw83oc="
"INv7q72C1HvIixY1qmt5tNASFBEc0PnXRSb780Y5aeI="
"QkM8Kog8TtCczysDmKu6ZOjwwYlcR2biiUzxkb3uBio="
"6eNuCU6RBkwKMmVV6Mhm0Q0ehJ8Qo5SqcGm3LIl62uQ="
"dAPKN8aHl5tgKpmx9vNoYvXfAdF+76G4S+L+ep+TzU="
"O5qQNLEjmmgCIB0TOsNOPCHiquq8ALbHHLcWvWhMuI="
"N9ERYp+i7yhEblAjaKaS3qf9uvMja0odC7ERYllHCI="
"wsBTpxyNLVLbJEbMttFdSfOwv6W9rXba4GGodVVxgo="
"sr+nF83THUjYcjzRVQbnDFUQVTkuZOZYe3D3bmF1D8="
"9EosvgyYOG5a136S54HVmmebwiBJJ8a3qGVWD878j5k="
"8ORZmAXZ4dlWeaMOsyxAFphwKh9SeimwBzf8eYqTis="
"gVepn2Up5rjVplJUvDHtgIeaBL+X6TPzm2j9O2JTDFI="
为什么会出现这种行为?
答案 0 :(得分:13)
这是因为您没有看到哈希的原始字节,而是Base64编码。
Base64编码将3个字节的块转换为4个字符的块。如果字节数可被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-hash是256位,即32字节。因此,前30个字节将获得40个字符,后2个字节将获得3个字符,填充将始终为=
。
答案 1 :(得分:5)
这些字符串使用base64进行编码,=
字符用作填充,以使base64字符串的最后一个块包含四个字符。
以下Ruby代码可用于获取base64解码字符串:
require 'base64'
s = "tINH0JxmryvB6pRkEii1iBYP7FRedDqIEs0Ppbw83oc="
puts Base64.decode64(s).bytes.map{|e| '%02x' % e}.join
输出:b48347d09c66af2bc1ea94641228b588160fec545e743a8812cd0fa5bc3cde87