也许是一个完全愚蠢的问题,但我无法解决这个问题......
首先,我需要使用提交标记的一部分生成SHA-1哈希。哈希是正确的,输出是;
0623f7917a1e2e09e7bcc700482392fba620e6a2
接下来我需要将这个哈希的base64编码为28个字符的sting。这是我在努力的地方,因为当我运行我的代码(或使用在线生成器)时,我得到了56个字符的刺痛。我得到的刺痛是;
MDYyM2Y3OTE3YTFlMmUwOWU3YmNjNzAwNDgyMzkyZmJhNjIwZTZhMg ==
问题是1)是否可以从上面的哈希中获取28个char字符串? 2)怎么......我哪里可能出错。
感谢您提供的任何帮助。
答案 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。