Base64 为什么SHA256哈希以“结束”=&引用;?

Base64 为什么SHA256哈希以“结束”=&引用;?,base64,behavior,sha256,Base64,Behavior,Sha256,我制作了一个Webservice,它在成功身份验证后返回一个安全令牌 但是,在调试时,我注意到webservice返回的每个哈希都以“=”结束,例如: 为什么会有这样的行为?这些字符串是使用=字符作为填充进行编码的,以使base64字符串的最后一块包含四个字符 以下Ruby代码可用于获取base64解码字符串: require 'base64' s = "tINH0JxmryvB6pRkEii1iBYP7FRedDqIEs0Ppbw83oc=" puts Base64.decode64(s)

我制作了一个Webservice,它在成功身份验证后返回一个安全令牌

但是,在调试时,我注意到webservice返回的每个哈希都以“=”结束,例如:


为什么会有这样的行为?

这些字符串是使用
=
字符作为填充进行编码的,以使base64字符串的最后一块包含四个字符


以下Ruby代码可用于获取base64解码字符串:

require 'base64'

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

输出:
b48347d09c66af2bc1ea94641228b588160fec545e743a8812cd0fa5bc3cde87
这是因为您看不到散列的原始字节,而是Base64编码

Base64编码将3个字节的块转换为4个字符的块。如果字节数可被3整除,则此方法效果良好。如果不是,则使用填充字符,因此生成的字符数仍然可以被4整除

因此:


SHA256哈希是256位,即32字节。因此,前30个字节将有40个字符,最后2个字节将有3个字符,填充将始终是一个
=

SHA密钥是一个整数,这里可能是密钥的编码。由于密钥是256位宽,或32字节,它将被编码为大约4/3*32~=43个字符。为什么它们只有44个字符长?你把它们编码成什么基?@pzp答案就在上面。真奇怪;当我在base64中编码我的SHA256输出时,它们总是64个字符长。@pzp那么要么它不是SHA256,要么它不是base64:例如,sha512密钥将是64字节宽,但在base64中大约是85个字符。在base64中,sha384密钥实际上会被编码为64个字符。寻找SHAI的变体,我当然同意答案,但我无法解释为什么问题中的字符串长度不同。也许是操作失误?
require 'base64'

s = "tINH0JxmryvB6pRkEii1iBYP7FRedDqIEs0Ppbw83oc="
puts Base64.decode64(s).bytes.map{|e| '%02x' % e}.join
(no of bytes)%3 = 0  => no padding needed
(no of bytes)%3 = 1  => pad with ==
(no of bytes)%3 = 2  => pad with =