为什么SHA256哈希完成" ="?

时间:2015-06-05 12:31:29

标签: base64 behavior sha256

我做了一个Web服务,在成功验证后返回一个安全令牌。

然而,在调试时,我注意到webservice返回的每个哈希都以" ="结束。如:

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

为什么会出现这种行为?

2 个答案:

答案 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