为什么我的base64编码的SHA-1哈希包含56个字符?

时间:2013-11-19 15:21:41

标签: hash base64 encode sha1

也许是一个完全愚蠢的问题,但我无法解决这个问题......

首先,我需要使用提交标记的一部分生成SHA-1哈希。哈希是正确的,输出是;

0623f7917a1e2e09e7bcc700482392fba620e6a2

接下来我需要将这个哈希的base64编码为28个字符的sting。这是我在努力的地方,因为当我运行我的代码(或使用在线生成器)时,我得到了56个字符的刺痛。我得到的刺痛是;

MDYyM2Y3OTE3YTFlMmUwOWU3YmNjNzAwNDgyMzkyZmJhNjIwZTZhMg ==

问题是1)是否可以从上面的哈希中获取28个char字符串? 2)怎么......我哪里可能出错。

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

SHA-1哈希长度为20个字节,但是这些字节不太可能全部都是可打印字符。 因此,如果要向人类显示这20个字节,则必须将它们编码为可打印的字符。

一种执行此操作的方法是hexadecimal,我们将每个字节都切成两半,然后用{{1}范围内的字符表示每一半(4位值,数字0-15)。 }。 因此,每个字节被编码为2个十六进制值,因此我们的20字节哈希值被编码为40字节可打印字符。

十六进制很容易计算,人类很容易查看编码并弄清字节的实际样子,但这并不是最有效的,因为我们只使用了95个ASCII可打印字符中的16个。

将任意二进制数据编码为可打印字符的另一种方法是Base 64。这样效率更高,可以平均4个base64值对3个字节进行编码,但是对于人类来说,解析该编码要困难得多。

您看到的行为是由于将20字节的哈希值编码为40字节的十六进制,然后将那些的40字节十六进制编码为56字节(0123456789abcdef,然后四舍五入到最接近的4个字节)。

您需要直接从原始哈希字节(如果可用)编码为base64,或者在将十六进制值解码为字节后再编码为base64。