为什么要对SHA1/SHA256哈希进行Base64编码?

12
2个回答

25

这些哈希值不是ASCII码——你看到十六进制数字的原因是,生成哈希值的软件将摘要的二进制输出转换为由十六进制数字组成的ASCII字符串。

例如,MD5摘要将填充一个16字节的数组。您也可以将其表示为32个字符的字符串,但最基本的摘要形式仍然是字节数组。

当您将字节数组转换为十六进制字符串时,您需要8位(一个完整字符)来表示每4位数据。尽管它通常不被称为这种方式,但您可以说这使用了"base16"编码,因为您每次抓取4个比特并将它们映射到一个由16个字符组成的字母表中。

另一方面,Base64每次抓取6个比特并将它们映射到一个由64个字符组成的字母表中。这意味着您需要8位(再次是一个完整字符)来表示每6位数据,这比base16浪费的位数少一半。一个base16编码的字符串将始终是原始数据的两倍大;一个base64编码的字符串只会增加四分之三的大小。对于SHA256哈希,base16需要64字节,但base64只需要约43字节。


@zneak,使用Base64编码哈希的空间效率是原因吗?难道不是我们需要将哈希发送出去并且需要把哈希表示为文本,而Base64通过限制二进制数据到一组64个大部分重叠的字符来实现这一点,这些字符来自于大多数常见的编码方式吗? - crackerplace
@zneak 我的意思是在任何计算机上以可呈现的形式提供哈希值。 - crackerplace
1
@whokares,十六进制编码和base64编码都可以将哈希转换为有效的ASCII字符串。如果您只关心这一点,任何一种编码方式都可以使用。然而,十六进制字符串(其中每个字节都表示为介于0和F之间的两个ASCII字符)将占用原始空间的两倍,而base64版本仅占用四分之三的空间。十六进制编码的SHA-256为64字节,而base64编码的SHA-256大约为43字节。 - zneak
@zneak.kool 谢谢。为了以不可打乱的方式传输哈希值,亚马逊需要将哈希值发送为Base64格式,因此它需要以可打印文本格式呈现。当然,这就是编码的定义 :-)。 - crackerplace

8
例如,下面的字节、十六进制和base64示例编码相同的字节:
  • 字节:243 48 133 140 73 157 28 136 11 29 189 101 194 101 116 64 172 227 220 78
  • 十六进制:f330858c499d1c880b1dbd65c2657440ace3dc4e
  • base64:8zCFjEmdHIgLHb1lwmV0QKzj3E4=
只是AWS要求其值为base64编码。

好的,但是使用base64而不是十六进制有什么好处吗?我的意思是为什么亚马逊使用base64而不是十六进制? - tuna
3
Base64可以用更少的ASCII字符编码相同的值。由于它们在请求中使用公钥签名,而公钥签名通常使用Base64编码,所以它们可能认为对所有值使用一种编码是有意义的。 - Dan D.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接